1.文件下載
我們知道在html5
中可以以a
標(biāo)簽的形式輕松實(shí)現(xiàn)文件下載逸尖,如下:
<a href="test.zip" download>下載文件</a>
但是這種做法的不足在于敢靡,對于.html
/.txt
/ .jpg
等文件救军,有些瀏覽器會(huì)直接打開嫉髓,所以考慮瀏覽器差異,需要謀求更通用的一種方式谎仲。
nodejs下載文件方式為浙垫,設(shè)置響應(yīng)頭,文件傳輸方式分為兩種:
1.1 直接讀取文件
fs.readFile(filePath, function(isErr, data){
if (isErr) {
res.end("Read file failed!");
return;
}
res.writeHead(200,{
'Content-Type': 'application/octet-stream', //告訴瀏覽器這是一個(gè)二進(jìn)制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告訴瀏覽器這是一個(gè)需要下載的文件
});
res.end(data)
})
1.2 stream
res.writeHead(200,{
'Content-Type': 'application/octet-stream', //告訴瀏覽器這是一個(gè)二進(jìn)制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告訴瀏覽器這是一個(gè)需要下載的文件
});
fs.createReadStream(filePath).pipe(res);
2.文件上傳
使用formidable模塊
var http = require("http");
var formidable = require('formidable');
var fs = require("fs");
var util = require("util");
var sd = require("silly-datetime");
var path = require("path");
//創(chuàng)建服務(wù)器
var server = http.createServer(function(req,res){
//如果你的訪問地址是這個(gè)郑诺,并且請求類型是post
if(req.url == "/uploads" && req.method.toLowerCase() == "post"){
//Creates a new incoming form.
var form = new formidable.IncomingForm();
//設(shè)置文件上傳存放地址
form.uploadDir = "./uploads";
//執(zhí)行里面的回調(diào)函數(shù)的時(shí)候夹姥,表單已經(jīng)全部接收完畢了。
form.parse(req, function(err, fields, files) {
//使用第三方模塊silly-datetime
var t = sd.format(new Date(),'YYYYMMDDHHmmss');
//生成隨機(jī)數(shù)
var ran = parseInt(Math.random() * 8999 +10000);
//拿到擴(kuò)展名
var extname = path.extname(files.tupian.name);
//舊的路徑
var oldpath = __dirname + "/" + files.tupian.path;
//新的路徑
var newpath = __dirname + '/uploads/'+t+ran+extname;
//改名
fs.rename(oldpath,newpath,function (err) {
if(err){
throw Error("改名失敗");
}
res.writeHead(200, {'content-type': 'text/plain'});
res.end("成功");
});
//所有的文本域辙诞、單選框辙售,都在fields存放;
//所有的文件域飞涂,files
res.writeHead(200, {'content-type': 'text/plain'});
res.end("success");
});
}
});