Express를 사용하여 NodeJS 서버에서 파일 다운로드
서버에 있는 파일을 노드의 페이지에 액세스 하는 머신에 다운로드하려면 어떻게 해야 합니까?JS 서버?
Express를 사용하고 있습니다.JS와 나는 이것을 시도해 왔다.
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();
});
다만, 파일명과 파일 타입(또는 확장자)을 취득할 수 없습니다.누가 나 좀 도와줄래?
갱신하다
app.get('/download', function(req, res){
const 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 유형을 확인하기 위해 mime 유형 라이브러리인 node-mime을 사용합니다.
여기서 또 하나 주의해야 할 점은 readStream을 사용하도록 코드를 변경했다는 것입니다.노드가 비동기화 되어 있기 때문에 이름에 'Sync'가 있는 메서드를 사용하는 것은 거부되기 때문에 이 방법이 훨씬 더 좋습니다.
사용
「첨부 파일」로서 패스의 파일을 전송 합니다.예:
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);
});
- 자세한 것은 이쪽
pdfs, Word docs 등의 정적 파일의 경우 Express의 정적 함수를 설정에 사용하십시오.
// Express config
var app = express().configure(function () {
this.use('/public', express.static('public')); // <-- This right here
});
그런 다음 모든 파일을 'public' 폴더에 넣습니다. 예를 들어 다음과 같습니다.
/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
'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()
...샘플 다운로드.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());
}
});
}
언급URL : https://stackoverflow.com/questions/7288814/download-a-file-from-nodejs-server-using-express
'source' 카테고리의 다른 글
PDO:: fetchAll vs. PDO:: 루프에서의 fetch (0) | 2023.02.01 |
---|---|
PDO: MySQL 서버가 사라졌습니다. (0) | 2023.02.01 |
어떻게 mysql에서 같은 테이블에 두 번 앉지? (0) | 2023.02.01 |
목록 이해에 있어서 if/inclused (0) | 2023.02.01 |
MySQL 문자열에서 n번째 단어와 단어 발생 횟수를 추출하는 방법은 무엇입니까? (0) | 2023.02.01 |