千牛PC端小程序上传文件有2种方案。第一种上传到云存储,第二种通过云应用上传到自己的服务端进行存储。
通过接口 my.qn.chooseFile获取本地文件的临时路径,然后上传到云存储。
const {cloud} = getApp();
Page({
data:{},
onLoad(query) {
// 页面加载
},
async testUploadFile(){
my.qn.chooseFile({
count: 1, // 返回的文件数,默认 1
type: 0x02, // 图片=0x01,文档=0x02,多媒体=0x04,自由组合,默认 0x01
success: (res) => {
console.log("上传文件 res:"+res);
try{
cloud.file.uploadFile({
filePath: res.apFilePaths[0],
fileType: 'other',
fileName: 'new.xlsx',
}).then((data) => {
console.log(data);
})
}catch(e) {
console.log("fail:"+ e);
}
}
})
}
});
通过接口 my.qn.chooseFile获取本地文件的临时路径,然后上传到云存储,将上传到云存储获取的访问链接传到云应用中,云应用中进行解析获取文件内容。
通过接口 my.qn.chooseFileAndGetContent 获取到文件内容,将文件内容直接传输到云应用中,前提是传输的内容不能超过128KB。
注:在自身服务器接口中要对文件内容进行base64解码后,再进行处理。
const {cloud} = getApp();
Page({
data:{},
onLoad(query) {
// 页面加载
},
async testQnContent(){
my.qn.chooseFileAndGetContent({
count: 1,
type: 0x02,
success: (res) => {
// {"fileContentMap":{"test1.txt":"YWJj","test2.txt":"MTIz"}}
//文件内容经过base64进行了编码
let contentMap = res.fileContentMap;
console.log("内容:"+contentMap);
try{
const result = cloud.application.httpRequest({
//在uploadFile接口中需要对文件内容进行base64解码
'path' : '/uploadFile',
'method':'POST',
'headers':{
'Content-Type':'application/json;charset=UTF-8',
},
'params':{},
'body':{
//fileContentMap里面保存文件名称以及经过base64编码后的文件内容
'fileContentMap':contentMap
},
//对于一个小程序关联多个云应用的场景,调用非默认云应用,需要指定对应的云应用Id,超时时间单位ms
'exts':{ "cloudAppId":"8676" ,"timeout":3000}
});
console.log(JSON.stringify(result));
} catch(e) {
console.log("fail: "+ e);
}
}
})
}
});
后端服务器
@PostMapping("/uploadFile")
public String uploadFile(@RequestBody FileDTO fileDTO){
Map<String, String> fileContentMap = fileDTO.getFileContentMap();
Iterator<Map.Entry<String, String>> iterator = fileContentMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, String> fileItem = iterator.next();
String fileName = fileItem.getKey();
String fileData = fileItem.getValue();
// 使用Base64Utils的decode方法进行解码
byte[] fileBytes = Base64Utils.decode(fileData);
//TODO 处理文件逻辑
....
}
return "";
}
前提:将文件上传至云存储,通过文件id去下载。
1.通过 cloud.file.getTempFileURL 接口获取到文件在线访问链接。
2.通过 my.downloadFile 接口下载文件获取到本地临时路径(注意,该接口仅支持https协议链接,且必须是阿里系链接;云存储文件类型返回的链接都是https协议,且为阿里系链接,直接使用即可)。
3.通过 my.qn.saveFileToDisk 接口下载到电脑磁盘里。
const {cloud} = getApp();
Page({
data:{},
onLoad(query) {
// 页面加载
},
async testDownFile(){
cloud.file.getTempFileURL({
fileId: ['cloud://C2D1DD8DC3B4xxx2EC4933963/test.xlsx']
}).then((data) => {
console.log(data[0].url);
let url = data[0].url;
my.downloadFile({
url: url,
success({ apFilePath }) {
console.log(apFilePath);
my.qn.saveFileToDisk({
apFilePath: apFilePath, // apFilePath from other APIs
complete: (res) => {
console.log(res)
},
})
},
fail(e) {
console.log("fail:"+e);
},
});
})
}
});