Ошибка: EXDEV: ссылка между устройствами запрещена, переименуйте '/tmp/ в Ubuntu 16.04 LTS
У меня проблема с загрузкой файла nodejs. я прочитал stack1 и stack2. но я думаю, что это другой случай на выходе терминала, как это:
> 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)
мой код:
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 Jessie или Ubuntu 16 LTS, это приводит к ошибке на терминале.
любое тело не может помочь? этот код просто отлично работает на элементарной ОС и арке.
11 ответов
Та же проблема. Обходной путь: прочитайте временный файл, запишите файл в новом месте и удалите временный файл:
// 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!');
});
});
Вы можете использовать пакет "mv" для решения этой проблемы. Ссылка NPM: https://www.npmjs.com/package/mv Как использовать:
Замените старый код на fs.rename:
fs.rename(temp_path, target_path, (err) => {
if (err) {
console.log('> FileServer.jsx | route: "/files/upload" | err:', err);
throw err;
}
});
С:
const mv = require('mv');
mv(temp_path, target_path, function (err) {
if (err) {
console.log('> FileServer.jsx | route: "/files/upload" | err:', err);
throw err;
}
});
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
var mv = require('mv');
http.createServer(function (req, res) {
if (req.url == '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var oldpath = files.filetoupload.path;
console.log(oldpath);
var newpath = 'F:/change path to your project dir/' + files.filetoupload.name;
mv(oldpath, newpath, function (err) {
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}enter code here
}).listen(8080);
Это помогло мне при работе с nodejs, концепция должна быть та же /questions/34512746/chto-oznachaet-oshibka-exdev-ssyilka-mezhdu-ustrojstvami-zapreschena/34512753#34512753
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
http.createServer(function (req, res) {
if (req.url == '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var oldpath = files.filetoupload.path;
console.log(oldpath);
var newpath = 'F:/your folder name/' + files.filetoupload.name;
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!');
});
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-
data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);
Я столкнулся с той же ошибкой при использовании томов докера.
Предыдущие решения мне не помогли, так как мне пришлось редактировать используемую мной структуру, а именно adminjs, и ее функцию загрузки.
Я хотел хранить изображения в локальном хранилище (папке изображений), пока приложение работало в контейнере докеров.
Я только что создал каталог с именем tmp внутри своего локального хранилища внутри этой папки изображений и добавил переменные среды TMP, TEMP, TMPDIR и TEMPDIR со значением созданной папки tmp. Значение выглядит следующим образом: «/app/images/tmp»
Команда запуска docker, которую я использовал:docker run --name my-app -v /home/user/images:/app/images
Надеюсь, это сработает и для остальных.
Чтобы решить эту проблему, вы можете переписать как:
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);
и для нескольких файлов, вы можете повторить этот блок в зависимости от длины файлов.
В моем случае его работа в пределах одного и того же пути к диску (диску) означает, что в c:/ произошла ошибка, если новый путь к диску отличается от диска с временным путем.
Эта проблема возникает, когда ваша временная папка находится на другом диске, а код узла находится на другом диске.
Он выдаст эту ошибку.
Решение находится в другом вопросе StackOverflow.
Что означает ошибка «EXDEV: ссылка между устройствами не разрешена»?
решение из этого поста:
Согласно новому NodeJS, решение не перемещать, копировать его
fs.copyFileSync(oldpath, newpath);
fs.unlink(oldpath,()=>{});
Моя Windows 11 находится на SSD, а мои коды на жестком диске. Загруженное изображение будет загружено на диск Windows, и я пытаюсь переместить его на жесткий диск.
Вы должны использовать fs.writeFileSync, иначе oldfile может быть удален перед копированием
fs.writeFileSync (newpath, data, function (err) {
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
console.log('File written!');
});
// Удалить файл fs.unlink (oldpath, function (err) {
if (err) throw err;
console.log('File deleted!');
});
Да, вы можете решить эту проблему как.
установить mv по команде
npm install mv --save
добавьте mv в ваш файл nodejs
var mv = require('mv');<br>
переместить файл как:
mv('source_file', 'destination_file,' function(err) { if (err) { throw err; } console.log('file moved successfully'); };