天天看點

express 上傳檔案 下載下傳檔案 中文名字報錯問題

先貼上 上傳和下載下傳代碼

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!

繼續閱讀