跳到主要内容

如何自定义文件上传

在使用微搭官方文件上传组件时,有时候我们需要自定义上传动作,此时可以用自定义云函数实现文件上传。

1. 自定义云函数

在微搭环境下,新建一个云函数 新增package.json文件

{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {},
"author": "",
"license": "ISC",
"dependencies": {
"@cloudbase/node-sdk": "latest",
"@cloudbase/manager-node": "^4.2.8",
"axios": "^1.6.3",
"form-data": "^4.0.0"
}
}

新增index.js文件

'use strict';
const CloudBase = require("@cloudbase/manager-node");
const FormData = require("form-data");
const axios = require("axios");
const fs = require("fs");
const path = require("path");

exports.main = async (event, context) => {
const file = event.file // base64编码后的文件
const fileName = event.fileName // 文件名
const cloudPath = "./" + fileName; // 云端路径
const baseStr = file.split("base64,")[1]
const binaryData = Buffer.from(baseStr, 'base64');
// 初始化
const app = CloudBase.init({});

// 获取功能模块
const { storage } = app;

// 获取文件扩展名
const ext = path.extname(fileName).toLowerCase();
if (ext !== ".docx") {
return { result: "文件类型不支持" }
} else {
let msg = ''
// 获取到元数据后,使用元数据内的信息,上传文件到云存储
await storage.getUploadMetadata(cloudPath).then(async (res) => {
const { authorization, token, cosFileId, url } = res;

// 构造提交表单
const form = new FormData();
form.append("Signature", authorization);
form.append("x-cos-security-token", token);
form.append("x-cos-meta-fileid", cosFileId);
form.append("key", cloudPath);
form.append("file", binaryData);
try {
await axios.post(url, form, { headers: form.getHeaders() })
msg = "上传成功"
} catch{
msg = "上传失败"
}

}).catch(() => {
msg = "上传失败"
});
return { result: msg }
}
};

2. APIs中定义此云函数

3. 在组件中使用

新建Query
上传前处理函数中不使用默认上传行为,改为query上传