Загрузите файл с сервера NodeJS с помощью Express
Как я могу загрузить файл, который находится на моем сервере, на мой компьютер, который обращается к странице на сервере nodeJS?
Я использую ExpressJS, и я пытался это:
app.get('/download', function(req, res){
var file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV', 'binary');
res.setHeader('Content-Length', file.length);
res.write(file, 'binary');
res.end();
});
Но я не могу получить имя файла и тип файла (или расширение). Кто-нибудь может мне помочь с этим?
9 ответов
Обновить
У Express есть помощник для облегчения жизни.
app.get('/download', function(req, res){
var file = __dirname + '/upload-folder/dramaticpenguin.MOV';
res.download(file); // Set disposition and send it.
});
Старый ответ
Что касается вашего браузера, имя файла просто "скачать", поэтому вам нужно дать ему больше информации, используя другой заголовок HTTP.
res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');
Вы также можете отправить MIME-типа, такие как это:
res.setHeader('Content-type', 'video/quicktime');
Если вы хотите что-то более глубокое, здесь вы идете.
var path = require('path');
var mime = require('mime');
var fs = require('fs');
app.get('/download', function(req, res){
var file = __dirname + '/upload-folder/dramaticpenguin.MOV';
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
Вы можете установить значение заголовка на то, что вам нравится. В этом случае я использую библиотеку MIME-типов - node-MIME, чтобы проверить, что MIME-тип файла.
Еще одна важная вещь, которую стоит отметить, это то, что я изменил ваш код для использования readStream. Это гораздо лучший способ сделать что-то, потому что использование любого метода с 'Sync' в имени не одобряется, потому что узел должен быть асинхронным.
использование res.download()
Он передает файл по пути как "вложение". Например:
var express = require('express');
var router = express.Router();
// ...
router.get('/:id/download', function (req, res, next) {
var filePath = "/my/file/path/..."; // Or format the path using the `id` rest param
var fileName = "report.pdf"; // The default name the browser will use
res.download(filePath, fileName);
});
- Узнайте больше о
res.download()
Для статических файлов, таких как PDF-файлы, Word-документы и т. Д., Просто используйте статическую функцию Express в вашей конфигурации:
// Express config
var app = express().configure(function () {
this.use('/public', express.static('public')); // <-- This right here
});
А затем просто поместите все свои файлы в эту "общую" папку, например:
/public/docs/my_word_doc.docx
И тогда обычная старая ссылка позволит пользователю скачать ее:
<a href="public/docs/my_word_doc.docx">My Word Doc</a>
Вот как я это делаю:
- создать файл
- отправить файл клиенту
- удалить файл
Код:
let fs = require('fs');
let path = require('path');
let myController = (req, res) => {
let filename = 'myFile.ext';
let absPath = path.join(__dirname, '/my_files/', filename);
let relPath = path.join('./my_files', filename); // path relative to server root
fs.writeFile(relPath, 'File content', (err) => {
if (err) {
console.log(err);
}
res.download(absPath, (err) => {
if (err) {
console.log(err);
}
fs.unlink(relPath, (err) => {
if (err) {
console.log(err);
}
console.log('FILE [' + filename + '] REMOVED!');
});
});
});
};
В Express 4.x есть attachment()
метод для Response
:
res.attachment();
// Content-Disposition: attachment
res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
Есть несколько способов сделать это. Это лучший способ.
res.download('/report-12345.pdf')
или в вашем случае это может быть
app.get('/download', function(req, res){
const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
res.download(file); // Set disposition and send it.
});
'use strict';
var express = require('express');
var fs = require('fs');
var compress = require('compression');
var bodyParser = require('body-parser');
var app = express();
app.set('port', 9999);
app.use(bodyParser.json({ limit: '1mb' }));
app.use(compress());
app.use(function (req, res, next) {
req.setTimeout(3600000)
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept,' + Object.keys(req.headers).join());
if (req.method === 'OPTIONS') {
res.write(':)');
res.end();
} else next();
});
function readApp(req,res) {
var file = req.originalUrl == "/read-android" ? "Android.apk" : "Ios.ipa",
filePath = "/home/sony/Documents/docs/";
fs.exists(filePath, function(exists){
if (exists) {
res.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition" : "attachment; filename=" + file});
fs.createReadStream(filePath + file).pipe(res);
} else {
res.writeHead(400, {"Content-Type": "text/plain"});
res.end("ERROR File does NOT Exists.ipa");
}
});
}
app.get('/read-android', function(req, res) {
var u = {"originalUrl":req.originalUrl};
readApp(u,res)
});
app.get('/read-ios', function(req, res) {
var u = {"originalUrl":req.originalUrl};
readApp(u,res)
});
var server = app.listen(app.get('port'), function() {
console.log('Express server listening on port ' + server.address().port);
});
вы можете использоватьres.sendFile()
... Sample-download.xlsx должен находиться в той же директории, что и эта функция.
const downloadFile = (req,res) => {
var options = {
root: path.join(__dirname),
};
let fileName = "Sample-download.xlsx";
res.sendFile(fileName, options, function (err) {
if (err) {
console.log(err);
return res.status(500).json({ success: false, message: "internal server error. please try again later" });
} else {
console.log("Sent:", fileName, "at", new Date().toString());
}
});
}
Допустим, вы создали форму для загрузки файлов пользователем.
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="upload"/>
</form>
enctype="multipart / form-data" - это просто протокол кодирования данных, который важен, если вы хотите загружать файлы
Теперь на стороне сервера мы можем реализовать следующий код, чтобы получить загруженный файл
app.post('/upload', async (req, res) => {
let file = req.files.file
//dir is director where you want to move your file
file.mv(dir, (error) => {
if (error) {
res.end("file could not be uploaded")
}
})
})
вот и все загруженный файл будет перемещен по желаемому пути.