2016-05-11 10 views
3

Ich habe Problem Upload-Datei nodejs. Ich habe gelesen stack1 und stack2. aber ich denke, diese anderen Fall auf Terminal-Ausgabe wie folgt aus:Fehler: EXDEV: Cross-Device Link nicht erlaubt, umbenennen '/ tmp/auf 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) 

mein Code:

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; 
     } 

Code Arbeit auf einem anderen Distro wie elementar os, aber wenn ich laufe Projekt auf debian jessie oder ubuntu 16 LTS dieser Fehler am Terminal.

Jeder Körper kann nicht helfen? Dieser Code lief einfach auf elementaren OS und Arch.

+0

Beide Fragen, die Sie verlinken auf sind verursacht durch genau das gleiche Problem (Sie können Dateien nicht über Dateisysteme/Partitionen umbenennen). Sie sollten versuchen, zu überprüfen, ob Sie die Upload-Middleware so konfigurieren können, dass ein temporäres Verzeichnis auf demselben Dateisystem wie der endgültige Speicherort der Dateien verwendet wird. Der Grund, warum dies bei anderen Distributionen funktioniert, ist, dass einige keine separate Partition für '/ tmp' erstellen. – robertklep

Antwort

-2

Ja, Sie können dieses Problem als.

  1. installieren mv durch Befehl

    npm install mv --save 
    
  2. hinzufügen mv in Ihrem NodeJS Datei

    var mv = require('mv');<br> 
    
  3. bewegen Datei als:

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

gute Frage ........ –

0

Um dieses Problem zu beheben, können Sie umschreiben als:

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); 

und für mehrere Dateien, können Sie diesen Block auf Länge von Dateien basierend laufen könnten.

5

Gleiches Problem. Umgehung: Lesen Sie die temporäre Datei, um die Datei in den neuen Standort schreiben und die temporäre Datei entfernen:

 // 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!'); 
      }); 
     });