先貼上 上傳和下載下傳代碼
const formidable = require(‘formidable’);
const shortid = require(‘shortid’);
const fs = require(‘fs’);
沒有的先install一下
async upload(req, res, next) {
try {
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = path.join(__dirname, '../../public/dist/upload/'); //設定路徑 根據你自己檔案存入你想存入的路徑
form.maxFieldsSize = 2 * 1024 * 1024; //大小限制
form.parse(req, function (err, fields, files) {
try{
if (err) {
res.send(siteFunc.renderApiErr(req, res, 500, err))
return;
}
var oldpath = files.File.path; //檔案原始路徑
let _id = shortid.generate() //随機一個id
var newpath
let suffix
//判斷不同的類型 重命名+字尾
//由于防止擷取檔案時重名問題特做此操作
if(files.File.type=='image/png'){
suffix=_id+'.png'
newpath = path.join(path.dirname(oldpath),suffix); //修改檔案名字
}
if(files.File.type=='image/jpeg'){
suffix=_id+'.jpg'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/x-rar-compressed'){
suffix=_id+'.rar'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/octet-stream'){
suffix=_id+'.rar'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/x-zip-compressed'){
suffix=_id+'.rar'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/zip'){
suffix=_id+'.zip'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/vnd.openxmlformats-officedocument.presentationml.presentation'){
suffix=_id+'.ppt'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/vnd.openxmlformats-officedocument.presentationml.presentation'){
suffix=_id+'.ppt'
newpath = path.join(path.dirname(oldpath),suffix);
}
if(files.File.type=='application/msword'){
suffix=_id+'.doc'
newpath = path.join(path.dirname(oldpath),suffix);
}
fs.rename(oldpath,newpath,(err)=>{
if(err) throw err;
// res.send(baseUrl+_id+'.png')
//完成後 下面傳回路徑 {url:baseUrl+suffix}
//res.send 内是我封裝的公用傳回方法 不用在意 根據你自己的調節就好
res.send(siteFunc.renderApiData(res, 200, '插入成功',{url:baseUrl+suffix}))
})
}
catch (err) {
res.send(siteFunc.renderApiErr(req, res, 500, err))
}
}
/**
* @apiGroup Oss
* @download 下載下傳
* @api {get} /Oss/download 下載下傳檔案
* @apiParam {string} name 檔案文字
* @apiParam {string} url 檔案路徑
* @apiSampleRequest /Oss/download
*/
async download(req, res, next) {
try {
var name =`${req.query.name}`; //檔案名字
name = encodeURI(name,"GBK") //中文名字轉義防止報錯
name = name.toString('iso8859-1') //中文名字轉義防止報錯
var path = `public/dist/upload/${req.query.url.split("/").reverse()[0]}`; //對于項目内相對檔案的路徑拼接
var size = fs.statSync(path).size;
var f = fs.createReadStream(path);
res.writeHead(200, {
'Content-Type': 'application/force-download',
'Content-Disposition': 'attachment; filename=' + name,
'Content-Length': size
});
f.pipe(res); // 推出檔案
}
catch (err) {
res.send(siteFunc.renderApiErr(req, res, 500, err))
}
}
以上是我用的方法 暫時沒發現什麼問題 暫做記錄 純手工 是以如果有幫到你 麻煩點個贊
THANKS!