2015-07-13 4 views
3

Я пытаюсь несколько недель менять имя загружаемого файла. Но до сих пор не повезло. Вместо имени файла, которое должно быть Chrysanthemum.jpg, оно становится хешем файла, то есть 241693260.jpgатрибут загрузки HTML5 не работает, Forcing file rename при загрузке

В моем back-end я использую Node.js и Express.js для обработки загрузки/загрузки файлов. Я использую имя файла и атрибуты, чтобы убедиться, что файлы не перезаписываются.

Вот HTML код:

<a class="btn btn-info" href="http://localhost:3000/getAttachments?name=Chrysanthemum.jpg&amp;type=image%2Fjpeg&amp;size=879394&amp;lastModified=1247549551674&amp;extension=jpg" download="Chrysanthemum.jpg" target="_blank">Download File</a> 

Вот мой фоновый:

app.use('/uploads', express.static(__dirname + "/uploads")); 

app.get("/getAttachments", function (req, res) { 
    try { 
     var fileToBeSent = hashCode(req.query.name + req.query.type + req.query.size + req.query.lastModified + req.query.extension); 
     fileToBeSent += req.query.extension ? '.' + req.query.extension : ''; 

    // res.sendFile("./uploads/" + fileToBeSent, { 
    //  root: __dirname, 
    //  "Content-Disposition": '"attachment; filename="' + (req.query.extension ? '.' + req.query.extension : '') + '"', 
    //  "Content-Type": "application/octet-stream" 
    // }); 

     res.redirect("/uploads/" + fileToBeSent); 
    } catch (err) { 
     console.log("an attempt to GET a file that doesn't exist."); 
    } 
}); 

Так как я переименовать имя файла в моем заднем конце, я пытаюсь переименовать файл обратно на его исходное имя с помощью HTML5, но я не добился успеха.

ОБНОВЛЕНИЕ: Использование результата sendFile выражения в той же проблеме.

UPDATE: Мой сервер использует кросс-ПРОИСХОЖДЕНИЕ

+0

Какой браузер вы используете при попытке проверить это. Согласно [caniuse.com] (http://caniuse.com/#feat=download) IE и Safari по-прежнему не поддерживают этот атрибут ... – War10ck

+0

Google Chrome и Firefox. – Apha

+0

@ War10ck Я думаю, что это не проблема с браузером, это проблема атрибута загрузки HTML5. – Apha

ответ

2

Все, что вам нужно сделать, это предоставить полное имя файла, в который вы хотите загрузить файл. В вашем Content-Disposition это не похоже, что вы предоставляете полное имя файла.

res.sendFile(__dirname + "/uploads/" + fileToBeSent, { 
     headers: { 
      'Content-Disposition': 'attachment; filename="' + req.query.name + '"' 
     } 
    }); 
+0

Это сработало. Огромное спасибо. – Apha

0

Re-переименование файла с помощью Node JS, не HTML5 является лучшим выбором.

Renaming files using node.js

+0

Тогда как я могу гарантировать, что два разных файла не будут переименованы в одно и то же имя перед загрузкой, и они будут перезаписаны друг другом. Это решение проблематично. – Apha

+0

Переименовал файл в «Chrysanthemum_Hash», решив вашу проблему, где _Hash - это существующий хэш? – Will

2

Я встретил эту проблему год назад и провел много времени, прежде чем обнаружил, что это потенциальная проблема Chrome Prove for version 35 and later избежать повторяющихся имен вы можете использовать статический идентификатор с приращением. Надеюсь, что этот ответ будет полезен

Смежные вопросы