!116 【功能修复】修复真机环境下的图片上传问题

Merge pull request !116 from 卢越/master
pull/117/head
芋道源码 2024-10-28 11:14:29 +00:00 committed by Gitee
commit f94df74591
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 57 additions and 51 deletions

View File

@ -204,32 +204,46 @@ async function uploadFiles(choosePromise, { onChooseFile, onUploadProgress }) {
// 如果是前端直连上传 // 如果是前端直连上传
if (UPLOAD_TYPE.CLIENT === import.meta.env.SHOPRO_UPLOAD_TYPE) { if (UPLOAD_TYPE.CLIENT === import.meta.env.SHOPRO_UPLOAD_TYPE) {
for (const file of files) { // 为上传创建一组 Promise
// 1.1 获取文件预签名地址 const uploadPromises = files.map(async (file) => {
const { data: presignedInfo } = await FileApi.getFilePresignedUrl(file.name); try {
// 1.2 获取二进制文件对象 // 1.1 获取文件预签名地址
const fileBuffer = await convertToArrayBuffer(file); const { data: presignedInfo } = await FileApi.getFilePresignedUrl(file.name);
// 1.3 上传文件 // 1.2 获取二进制文件对象
await uni.request({ const fileBuffer = await convertToArrayBuffer(file);
url: presignedInfo.uploadUrl, // 预签名的上传 URL
method: 'PUT', // 使用 PUT 方法 // 返回上传的 Promise
header: { return new Promise((resolve, reject) => {
'Content-Type': file.fileType + '/' + file.name.substring(file.name.lastIndexOf('.') + 1), // 设置内容类型 uni.request({
}, url: presignedInfo.uploadUrl, // 预签名的上传 URL
data: fileBuffer, // 文件的路径,适用于小程序 method: 'PUT', // 使用 PUT 方法
success: (res) => { header: {
// 1.4. 记录文件信息到后端(异步) 'Content-Type':
createFile(presignedInfo, file); file.fileType + '/' + file.name.substring(file.name.lastIndexOf('.') + 1), // 设置内容类型
// 1.5. 重新赋值 },
file.url = presignedInfo.url; data: fileBuffer, // 文件的路径,适用于小程序
console.log('上传成功:', res); success: (res) => {
}, // 1.4. 记录文件信息到后端(异步)
fail: (err) => { createFile(presignedInfo, file);
console.error('上传失败:', err); // 1.5. 重新赋值
}, file.url = presignedInfo.url;
}); console.log('上传成功:', res);
} resolve(file);
return files; },
fail: (err) => {
console.error('上传失败:', err);
reject(err);
},
});
});
} catch (error) {
console.error('上传失败:', error);
throw error;
}
});
// 等待所有上传完成
return await Promise.all(uploadPromises); // 返回已上传的文件列表
} else { } else {
// 后端上传 // 后端上传
for (let file of files) { for (let file of files) {

View File

@ -44,13 +44,7 @@
<script> <script>
import { chooseAndUploadFile, uploadCloudFiles } from './choose-and-upload-file.js'; import { chooseAndUploadFile, uploadCloudFiles } from './choose-and-upload-file.js';
import { import { get_extname, get_files_and_is_max, get_file_data } from './utils.js';
get_file_ext,
get_extname,
get_files_and_is_max,
get_file_info,
get_file_data,
} from './utils.js';
import uploadImage from './upload-image.vue'; import uploadImage from './upload-image.vue';
import uploadFile from './upload-file.vue'; import uploadFile from './upload-file.vue';
import sheep from '@/sheep'; import sheep from '@/sheep';
@ -352,22 +346,21 @@
/** /**
* 选择文件并上传 * 选择文件并上传
*/ */
chooseFiles() { async chooseFiles() {
const _extname = get_extname(this.fileExtname); const _extname = get_extname(this.fileExtname);
// //
uniCloud await chooseAndUploadFile({
.chooseAndUploadFile({ type: this.fileMediatype,
type: this.fileMediatype, compressed: false,
compressed: false, sizeType: this.sizeType,
sizeType: this.sizeType, // TODO video
// TODO video extension: _extname.length > 0 ? _extname : undefined,
extension: _extname.length > 0 ? _extname : undefined, count: this.limitLength - this.files.length, //9
count: this.limitLength - this.files.length, //9 onChooseFile: this.chooseFileCallback,
onChooseFile: this.chooseFileCallback, onUploadProgress: (progressEvent) => {
onUploadProgress: (progressEvent) => { this.setProgress(progressEvent, progressEvent.index);
this.setProgress(progressEvent, progressEvent.index); },
}, })
})
.then((result) => { .then((result) => {
this.setSuccessAndError(result); this.setSuccessAndError(result);
}) })
@ -587,7 +580,7 @@
path: v.path, path: v.path,
size: v.size, size: v.size,
fileID: v.fileID, fileID: v.fileID,
url: v.path, url: v.url,
}); });
}); });
return newFilesData; return newFilesData;

View File

@ -17,12 +17,11 @@ export const get_file_ext = (name) => {
*/ */
export const get_extname = (fileExtname) => { export const get_extname = (fileExtname) => {
if (!Array.isArray(fileExtname)) { if (!Array.isArray(fileExtname)) {
let extname = fileExtname.replace(/(\[|\])/g, ''); let extname = fileExtname.replace(/([\[\]])/g, '');
return extname.split(','); return extname.split(',');
} else { } else {
return fileExtname; return fileExtname;
} }
return [];
}; };
/** /**
@ -91,7 +90,7 @@ export const get_file_data = async (files, type = 'image') => {
extname: extname || '', extname: extname || '',
cloudPath: files.cloudPath, cloudPath: files.cloudPath,
fileType: files.fileType, fileType: files.fileType,
url: files.path || files.path, url: files.url || files.path,
size: files.size, //单位是字节 size: files.size, //单位是字节
image: {}, image: {},
path: files.path, path: files.path,