Koa2實(shí)現(xiàn)多并發(fā)文件上傳

koa2批量上傳文件

目前的是為了實(shí)現(xiàn)批量導(dǎo)入md文件,發(fā)布文章。這樣就不用自己一篇一篇同步文章了。一次可以同步幾千篇文章。

圖片.png

內(nèi)容

主要包含上傳的文件標(biāo)題,文件大小,上傳狀態(tài)。

      <el-upload ref="uploader" v-model:file-list="fileList" drag multiple :accept="accept" :maxSize="maxSize"
        :limit="999" :data="data" :show-file-list="false" :http-request="request" :before-upload="before"
        :on-progress="progress" :on-success="success" :on-error="error" @handleChange="handleChange">
        <slot name="uploader">
          <div class="el-upload__text">將文件拖到此處或 <em>點(diǎn)擊選擇文件上傳</em></div>
        </slot>
        <template #tip>
          <div class="el-upload__tip">
            <p v-if="templateUrl" style="margin-top: 7px">
              <el-link :href="templateUrl" target="_blank" type="primary" :underline="false">下載導(dǎo)入模板</el-link>
            </p>
          </div>
        </template>
      </el-upload>

這個(gè)采用自定義上傳

        request(param) {
            const data = new FormData()
            data.append(param.filename, param.file)
            for (const key in param.data) {
                data.append(key, param.data[key])
            }
            uploadFiles(data).then((res) => {
                var reader = new FileReader()
                reader.readAsText(param.file, 'UTF-8')
                reader.onload = function(e) {
                    var content = e.target.result
                    param.onSuccess(content)
                }
            }).catch((err) => {
                param.onError(err)
            })
        }

koa2實(shí)現(xiàn)接口uploadFiles,文件多線程上傳文件

  async uploadFiles(ctx) {
    const files = ctx.request.files || {};
    if (!files || Object.keys(files).length === 0) {
      ctx.status = 400;
      ctx.body = "請(qǐng)選擇的上傳文件";
      return;
    }
    const uploadPromises = Object.values(files).map(async (file) => {
      const reader = fs.createReadStream(file.path);
      const stream = fs.createWriteStream(`uploads/${file.name}`);
      const content = fs.readFileSync(file.path, 'utf8');
      reader.pipe(stream);
      return new Promise((resolve, reject) => {
        reader.on("end", async () => {
          fs.unlinkSync(file.path); // Delete the temporary file
          resolve({ name: file.name, status: 'uploaded' });
        });
        //content為讀取上傳文件的內(nèi)容
        //此處存入數(shù)據(jù)庫(kù)中
        //數(shù)據(jù)庫(kù)已經(jīng)處理了轉(zhuǎn)義字符存儲(chǔ)的問(wèn)題
        reader.on("error", (err) => {
          reject(err);
        });
      });
    });

    try {
      const data = await Promise.all(uploadPromises);
      ctx.body = {
        code: 0,
        data: data,
      };
    } catch (err) {
      ctx.code = -1;
      ctx.body = "文件上傳失敗";
    }
  }

處理md文件存儲(chǔ)時(shí),mysql存儲(chǔ)特殊字符轉(zhuǎn)義問(wèn)題

  async insert(params, table) {
    let columns = "";
    let values = "";
    for (const key in params) {
      columns += `${key}, `;
      values += `${mysql.escape(params[key])}, `;
    }
    columns = columns.slice(0, -2);
    values = values.slice(0, -2);
    return await query(`INSERT INTO ${table} (${columns}) VALUES (${values})`);
  }

地址

演示地址

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

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

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