node egg.js使用superagent作文件轉發

使用 egg.js + superagent 進行文件上傳轉發

// app/controller/file.js
const Controller = require('egg').Controller;
const fs = require('fs')
const request = require('superagent')
const sendToWormhole = require('stream-wormhole')
const toArray = require('stream-to-array');
const path = require('path');
const uuid = require('uuid/v1');

class FileController extends Controller {
    async file() {
        const { ctx, app } = this;
        // 獲取上傳的文件
        let stream;
        try {
            stream = await ctx.getFileStream();
        } catch (e) {
            console.error('文件不存在或者文件錯誤');
        }
        if (!stream) {
            ctx.throw(403,'文件不存在或者文件錯誤')
            return false;
        }
        const nameid = uuid().replace(/-/g, '');
        const filename = nameid + '.' + stream.filename.toLowerCase().split('.').pop();
        // 文件暫時存在 app/public 文件夾下
        const target = path.join(this.config.baseDir, 'app/public', filename);
        const url = '上傳地址';
        // 使用 superagent 上傳
        try {
            // 轉化stream
            const parts = await toArray(stream);
            let buf = Buffer.concat(parts);
            // 寫入文件保存至本地
            fs.writeFileSync(target, buf);
            // 上傳
            const res = await request
                .post(url)
                .attach('file', target, filename)
            ctx.body = res.text;
        } catch (err) {
            // 必須將上傳的文件流消費掉,要否則瀏覽器響應會卡死
            await sendToWormhole(stream);
            ctx.throw(500,'文件上傳出錯');
        }
        
        // 由於只作臨時保存,在上傳完畢後刪除文件
        fs.unlink(target, function (err) {
            if (!err) {
                console.log('文件已刪除:', target);
            }
        });
    }
}
module.exports = FileController;

地址資源連接
superagent官方文檔javascript

http://visionmedia.github.io/superagent/html

egg文件上傳參考文檔java

https://eggjs.org/zh-cn/basics/controller.html#%E8%8E%B7%E5%8F%96%E4%B8%8A%E4%BC%A0%E7%9A%84%E6%96%87%E4%BB%B6git

相關文章
相關標籤/搜索