秋望
秋望
  • 发布:2023-04-12 13:52
  • 更新:2024-04-29 16:59
  • 阅读:414

文件上传 切片分段 APP

分类:uni-app

说明

使用 5+api
目前仅测试了app,测试也不完整,这里只是提供一个方法

利用 5+app 中 file.slice方法切片,再转化成base64上传,而我需要的正好就是base64格式

就当是记录一下

代码如下

/**  
 * 上传文件  
 * @param {Object} url需要绝对路径  
 */  
function Upload(url) {  
    return new Promise(async (resolve, reject) => {  
        let file;  
        try {  
            url = verifyFileUrl(url)  
            file = await getFileManagerSync(url);  
            let size = file.size,  
                chunk = 1048576,  
                current = 0;  
            // 开始切片  
            while (current < size) {  
                let tmp = file.slice(current, Math.min(current   chunk, size));  
                // 切片后返回的也是 file 对象,直接读取内容  
                let base64 = await file_reader_as_data_url(tmp);  
                let r = await UpFile(base64);  
                current  = chunk   1;  
            }  
            resolve('上传成功')  
        } catch (e) {  
            reject(e)  
        } finally {  
            if (file !== undefined) file.close();  
        }  
    })  
}  

/**  
 * 上传到服务器方法  
 * @param {Object} base64  
 */  
function UpFile(base64){  
    // 文件上传  
}  

/**  
 * 文件路径 可能是 file://store/  开头  
 * @param {Object} str 文件路径  
 */  
function verifyFileUrl(str) {  
    if (str.startsWith('file://')) {  
        str = str.substring(7)  
    }  
    return str  
}  

/**  
 * 使用5 app 获取file对象  
 * @param {Object} fileName  
 */  
function getFileManagerSync(fileName) {  
    return new Promise((resolve, reject) => {  
        plus.io.resolveLocalFileSystemURL(fileName, function(fs) {  
            fs.file(function(file) {  
                resolve((file))  
            })  
        }, err => {  
            reject(err)  
        })  
    })  
}  

/**  
 *  读取文件对象的 base64字符串  
 * @param {Object} file 5 app 的 文件对象  
 */  
function file_reader_as_data_url(file){  
    return new Promise((resolve,reject)=>{  
        try{  
            let fileReader =new plus.io.FileReader();  
            fileReader.onloadend = function(evt) {  
                resolve(evt.target.result)  
            };  
            fileReader.readAsDataURL(file,'UTF-8');  
        }catch(e){  
            //TODO handle the exception  
            reject(e)  
        }  
    })  
}
0 关注 分享

要回复文章请先登录注册

秋望

秋望 (作者)

回复 1***@qq.com :
大半年没登录了,才看到评论。。。。。。
2024-04-29 16:59
1***@qq.com

1***@qq.com

file.slice切完片之后里面的fullpath还是源文件的路径,这个时候如果我想用uni.upload方法上传的话是不是得把切片文件对象先保存回本地再上传?
2023-09-01 17:50