2016-05-11 3 views
3

問題のアップロードファイルnodejsがあります。私は読んだ stack1stack2です。しかし、私はこのように端末に出力する上で、この異なる場合 を考える:エラー:EXDEV:デバイス間のリンクが許可されていません。 '/ tmp/on Ubuntu 16.04 LTS

> Unhandled rejection Error: EXDEV: cross-device link not permitted, 
> rename '/tmp/31941-53enly.png' -> 
> 'public/files/complaint/Screenshot_2016-05-01_01-16-55.png' 
>  at Error (native) 
>  at Object.fs.renameSync (fs.js:681:18) 
>  at null.<anonymous> (/home/faris/myprojects/orchestrale-server/routes/complaintimage.js:163:20) 
>  at tryCatcher (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/util.js:16:23) 
>  at Promise._settlePromiseFromHandler (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:502:31) 
>  at Promise._settlePromise (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:559:18) 
>  at Promise._settlePromise0 (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:604:10) 
>  at Promise._settlePromises (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:683:18) 
>  at Async._drainQueue (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:138:16) 
>  at Async._drainQueues (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:148:10) 
>  at Immediate.Async.drainQueues [as _onImmediate] (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:17:14) 
>  at processImmediate [as _immediateCallback] (timers.js:383:17) 

私のコード:基本OSのような他のディストリビューションに

if (_.isEmpty(req.files) == false) { 
     var tp = avatar_folder+req.files.file.name; 
     fs.renameSync(req.files.file.path, tp, function(err){}); 
     var avatar = req.files.file.name; 
     } 

コードの仕事が、私はDebianのジェシーやUbuntuの16でプロジェクトを実行するときLTSは端末でエラーが発生する。

どのような体は助けになれませんか?そのコードは基本的なosとarchで完璧に動作します。

+0

両方の質問でなければなりませんまったく同じ問題が原因です(ファイルシステム/パーティション間でファイルの名前を変更することはできません)。ファイルの最終的な場所と同じファイルシステム上の一時ディレクトリを使用するようにアップロードミドルウェアを構成できるかどうか試してみるべきです。これが他のディストリビューションで動作する理由は、 '/ tmp'のために別のパーティションを作成しないものがあるからです。 – robertklep

答えて

-2

はい、この問題は次のように解決できます。

  1. あなたnodejsでMVを追加するコマンド

    npm install mv --save 
    
  2. でMVをインストールするファイル

    var mv = require('mv');<br> 
    
  3. 移動ファイルとして:

    mv('source_file', 'destination_file,' function(err) { 
        if (err) { throw err; } 
    console.log('file moved successfully'); 
    }; 
    
+0

良い質問........ –

0

この問題を解決するためには、として書き直すことができます。

fs.writeFile(path_where_to_write, file, function(err) { 
    if (err) throw err; /*do something else.*/ 
}); 
/*and then Remove the file from tmp location*/ 
fs.unlink(tempPath); 

と、複数のファイルに対して、ファイルの長さに基づいて、このブロックを反復することができます。

5

同じ問題。回避策:一時ファイルを読み込み、新しい場所にファイルを書き込み、一時ファイル削除:

 // Read the file 
     fs.readFile(oldpath, function (err, data) { 
      if (err) throw err; 
      console.log('File read!'); 

      // Write the file 
      fs.writeFile(newpath, data, function (err) { 
       if (err) throw err; 
       res.write('File uploaded and moved!'); 
       res.end(); 
       console.log('File written!'); 
      }); 

      // Delete the file 
      fs.unlink(oldpath, function (err) { 
       if (err) throw err; 
       console.log('File deleted!'); 
      }); 
     }); 
0

nodejsで作業する場合、それは私を支援し、コンセプトは、あなたがにリンクされている同じhttps://stackoverflow.com/a/43206506/7878987

+0

あなたのリンクのみの回答に文脈を追加してください! –

関連する問題