node實現文件下載


1.方法一:

router.post('/downloadPdf',(req,res)=>{
	// let { filename,mimeType } = req.body;
	let { filename,mimeType } = req.query;
	// var path="public/pdf/5ea56710fb5a2fdad7cabcf3.pdf";
	// filename = '02cbc5d9-e10f-4f8d-8fae-304cc609a8f0';  //pdf
	// filename = '6f3db1f9-e247-4aa5-bca7-93bae62a0079' // mp4 
	// filename = '6a908990-0c4f-4101-9e9d-4c8b00a8133b' // doc
	// filename='2055c73b-1b37-40bc-ba50-b6b8ef82e63c' // docx
	// mimeType='application/pdf';

	let type = getType(mimeType);  //獲取文件后綴名
	console.log(filename,mimeType,type);

	// path = path.join(__dirname, '../public/showPdf/'+filename+'.'+type);
	path='./public/showPdf/'+filename+'.'+type;
	// path="C:\Users\sswc\Desktop\gai2\public\showPdf\02cbc5d9-e10f-4f8d-8fae-304cc609a8f0.pdf"
	console.log(path);


	var fileStream = fs.createReadStream(path);
	var size = fs.statSync(path).size;
	res.setHeader('Content-Type', mimeType);
	res.setHeader('Content-Disposition', `attachment;filename=${filename}.${type}`); 
	res.setHeader('Content-Length', size);
	fileStream.on('data', function (data) {
		res.write(data, 'binary');
	});
	fileStream.on('end', function () {
		res.end();
		console.log('The file has been downloaded successfully!');
	});
	
})

 2.方法二:

router.post('/downloadPdf',(req,res)=>{
	// let { filename,mimeType } = req.body;
	let { filename,mimeType } = req.query;
	// var path="public/pdf/5ea56710fb5a2fdad7cabcf3.pdf";
	// filename = '02cbc5d9-e10f-4f8d-8fae-304cc609a8f0';  //pdf
	// filename = '6f3db1f9-e247-4aa5-bca7-93bae62a0079' // mp4 
	// filename = '6a908990-0c4f-4101-9e9d-4c8b00a8133b' // doc
	// filename='2055c73b-1b37-40bc-ba50-b6b8ef82e63c' // docx
	// mimeType='application/pdf';

	let type = getType(mimeType);  //獲取文件后綴名
	console.log(filename,mimeType,type);

	// path = path.join(__dirname, '../public/showPdf/'+filename+'.'+type);
	path='./public/showPdf/'+filename+'.'+type;
	// path="C:\Users\sswc\Desktop\gai2\public\showPdf\02cbc5d9-e10f-4f8d-8fae-304cc609a8f0.pdf"
	console.log(path);


	fs.readFile(path, (err, data) => {
		if (err) {
		  throw err
		}
		res.setHeader('Content-Type',mimeType)
		// 設置文件名
		// Content-disposition 是 MIME 協議的擴展,MIME 協議指示 MIME 用戶代理如何顯示附加的文件
		// attachment 以附件形式下載
		res.setHeader('Content-Disposition', `attachment; filename=${filename}.${type}`)
		// 返回數據
		res.end(data)
	})

})

上面兩種通過node實現得下載代碼得方式,獲取文件路徑需要通過相對路徑,不能通過node提供得path取獲取路徑,如下所示:

path = path.join(__dirname, '../public/showPdf/'+filename+'.'+type);

在剛做文件下載時候,我是通過path來獲取文件得路徑,文件是可以下載得,但是只能下載一次,到第二次下載得時候,path獲取路徑得時候,會出現問題,導致接口包500得錯誤。當時耽擱了一整天,也沒發現錯在那里了,但是我寫的下載接口就是只能調用一邊,后面我看了看和其他人寫的有什么不同,突然間看見是因為path得原因。當我的path通過相對路徑獲取得時候,下載接口恢復了正常。 

注意:我這里得getType()方法是用來獲取文件得后綴名得,因為當時我們做得時候,平台支持得文件有很多種形式,為了做各種文件得下載兼容以及更好得取尋找我們需要對應得文件,所以定義了一個方法,用來兼容各種類型得文件,該方法如下所示:

// 獲取文件得后綴名
function getType(mimeType){
	switch(mimeType) {
		case 'video/x-msvideo':  return 'avi';
		case 'video/x-ms-wmv': return 'wmv';
		case 'video/x-flv': return 'flv';
		case 'image/x-ico': return 'ico';
		case 'image/x-psd': return 'psd';
		case 'text/csv': return 'csv';
		case 'text/html': return 'html';
		case 'text/plain': return 'txt';
		case 'text/xml': return 'xml';
		case 'video/mp4': return 'mp4';
		case 'video/mpeg': return 'mpg';
		case 'application/x-shockwave-flash': return 'swf';
		case 'audio/mpeg': return 'mp3';
		case 'audio/x-ogg': return 'ogg';
		case 'audio/x-wav': return 'wav';
		case 'image/jpeg': return 'jpg';
		case 'image/png': return 'png';
		case 'image/svg+xml': return 'svg';
		case 'application/x-mspublisher': return 'pub';
		case 'application/vnd.visio': return 'vsd';
		case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': return 'docx';
		case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': return 'xlsx';
		case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': return 'pptx';
		case 'application/msword': return 'doc';
		case 'application/pdf': return 'pdf';
		case 'application/postscript': return 'ps';
		case 'application/rtf': return 'rtf';
		case 'application/vnd.ms-access': return 'mdb';
		case 'application/vnd.ms-excel': return 'xls';
		case 'application/vnd.ms-powerpoint': return 'ppt';
		case 'application/vnd.oasis.opendocument.text': return 'ott';
	}
}

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM