NodeJS 實現(xiàn)文件上傳

背景

實現(xiàn)上傳一個文件到 NodeJS 的服務(wù)。

引入

  const fs = require('fs');
  const path = require('path');
  const extname = path.extname;
  const os = require('os');

先導(dǎo)入這些包。

  app.use(async function(ctx, next) {
  // ignore non-POSTs
  if ('POST' != ctx.method) return await next();

  const file = ctx.request.files.file;
  const reader = fs.createReadStream(file.path);
  const stream = fs.createWriteStream(path.join(os.tmpdir(), Math.random().toString()));
  reader.pipe(stream);
  console.log('uploading %s -> %s', file.name, stream.path);

  ctx.redirect('/');
});

可以看到,通過 ctx.request.files.file 獲得來自http請求中的文件,再構(gòu)建文件流寫入到本地文件。

我的代碼示例

  const fs = require('fs');
  const path = require('path');
  const extname = path.extname;
  const os = require('os');

  const upload = async function(ctx, next) {
    // ignore non-POSTs
    if ('POST' != ctx.method) return await next();
    if(!ctx.path.indexOf('/upload') == 0 )  return await next();

    const paras = ctx.request.body;
    console.log('paras = ' + JSON.stringify(paras));
    if(!ctx.request.files.file){
      const err = '參數(shù)錯誤: 缺少上傳的文件';
      console.log(err);
      ctx.body = {resultCode:400, message:err}
      ctx.response.type = 'application/json';
      return;
    }
    let uploadedFileName = ctx.request.files.file.name;
    console.log(`ctx.request.files.file.name = ${uploadedFileName}`);
    const file = ctx.request.files.file;
    const reader = fs.createReadStream(file.path);
    let targetFile = path.join(os.tmpdir(), Math.random().toString());
    console.log(`targetFile = ${targetFile}`);
    const stream = fs.createWriteStream(targetFile);
    reader.pipe(stream);
    console.log('uploading %s -> %s', file.name, stream.path);
    if(fs.existsSync(targetFile)){
      console.log('上傳成功!');
    }
    let newPath = path.join(ctx.projectRootPath, '/public',uploadedFileName);
    fs.renameSync(targetFile, newPath);
    if(fs.existsSync(newPath)){
      console.log(`移動文件成功,到 ${newPath} `);
    }
    ctx.response.type = 'application/json';
    ctx.body = {resultCode:200, message:'ok'}
  }



  module.exports = function (){
    return upload;
  };

控制臺訪問:

curl http://127.0.0.1:6601/upload -F   "file=@/Users/zhangyunfei/Downloads/1.txt" -F "source=xxx" -v

使用 curl 實現(xiàn)上傳調(diào)用

參考

https://github.com/koajs/examples/blob/master/upload/app.js

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文件上傳需要解析文件,之前我們解析數(shù)據(jù)使用body-parser,解析文件可以用multer。body-parse...
    super靜_jingjing閱讀 1,037評論 0 1
  • 前端頁面結(jié)構(gòu) node 服務(wù)端 需用到connect-multiparty 模塊 npm install conn...
    希碩閱讀 1,784評論 0 0
  • 今早窗外嘰嘰喳喳的鳥鳴叫醒了我,由于已經(jīng)連續(xù)十天在鬧鐘前起床,今天雖然比往常早了一個小時,不過還是決定起床。 悠哉...
    許小糊閱讀 177評論 0 6
  • 今天入黨培訓(xùn)結(jié)束了,感覺收獲很大。第二次參加培訓(xùn),重聽了一次黨課,對黨的歷史黨的章程,黨的紀(jì)律,黨的要求都有了更深...
    清風(fēng)如水閱讀 505評論 0 4
  • rpc服務(wù)設(shè)計 經(jīng)驗:http://www.infoq.com/cn/presentations/system-s...
    jey恒閱讀 2,125評論 0 3

友情鏈接更多精彩內(nèi)容