1.文件下载
我们知道在html5
中可以以a
标签的形式轻松实现文件下载,如下:
<a href="test.zip" download>下载文件</a>
但是这种做法的不足在于,对于.html
/.txt
/ .jpg
等文件,有些浏览器会直接打开,所以考虑浏览器差异,需要谋求更通用的一种方式。
nodejs下载文件方式为,设置响应头,文件传输方式分为两种:
1.1 直接读取文件
fs.readFile(filePath, function(isErr, data){
if (isErr) {
res.end("Read file failed!");
return;
}
res.writeHead(200,{
'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
});
res.end(data)
})
1.2 stream
res.writeHead(200,{
'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
});
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");
//创建服务器
var server = http.createServer(function(req,res){
//如果你的访问地址是这个,并且请求类型是post
if(req.url == "/uploads" && req.method.toLowerCase() == "post"){
//Creates a new incoming form.
var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./uploads";
//执行里面的回调函数的时候,表单已经全部接收完毕了。
form.parse(req, function(err, fields, files) {
//使用第三方模块silly-datetime
var t = sd.format(new Date(),'YYYYMMDDHHmmss');
//生成随机数
var ran = parseInt(Math.random() * 8999 +10000);
//拿到扩展名
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");
});
}
});