Python基于React?Dropzone实现上传组件的示例代码( 二 )
const promiseArray = largeFiles.map(file => new Promise((resolve, reject) => {const chunkSize = CHUNK_SIZE;const chunks = Math.ceil(file.size / chunkSize);let chunk = 0;let chunkArray = new Array();while (chunk <= chunks) {let offset = chunk * chunkSize;let slice = file.slice(offset, offset+chunkSize)chunkArray.push([slice, offset])++chunk;}const chunkUploadPromises = (slice, offset) => {const largeFileData = https://www.yf-zs.com/redian/new FormData();largeFileData.append('largeFileData', slice)return new Promise((resolve, reject) => {axios({method: 'POST',url: '/api/files/largefile',data: largeFileData,headers: {"Content-Type": "multipart/form-data"}}).then(resp => {console.log(resp);resolve(resp);}).catch(err => {reject(err);})})};chunkArray.reduce( (previousPromise, [nextChunk, nextOffset]) => {return previousPromise.then(() => {return chunkUploadPromises(nextChunk, nextOffset);});}, Promise.resolve());resolve();}))
flask代码:
filename = secure_filename(''.join(lazy_pinyin(filename)))Path(UPLOAD_FOLDER + '/' + file_info['dir_path']).mkdir(parents=True, exist_ok=True)save_path = os.path.join(UPLOAD_FOLDER + '/' + file_info['dir_path'], filename)# rm file if existsif offset == 0 and save_path.exists(filename):os.remove(filename)try:with open(save_path, 'ab') as f:f.seek(offset)f.write(file.stream.read())print("time: "+ str(datetime.now())+" offset: " + str(offset))exceptOSError:return jsonify({'Could not write to file'}), 500
结语
文件传输一直都是HTTP的痛点 , 尤其是大文件传输 。最好的方式是自己做个Client , 通过FTP和FTPS的协议进行传输 。第二种来自于大厂很中心化的方法 , 通过文件的checksum来确定文件是否已经上传了 , 来营造秒传的效果 。第三种来自去中心化的Bittorrent的方法每一个用户做文件种子 , 提供文件传输的辅助 , 目前国内并没有普及使用 。
【Python基于React?Dropzone实现上传组件的示例代码】到此这篇关于Python基于React-Dropzone实现上传组件的示例代码的文章就介绍到这了,更多相关Python React-Dropzone上传组件内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
- 基佬用的小蓝是什么吗
- 确立大战略的首要原则是
- python怎么让程序重复运行
- 营销战略是基于业务层的战略吗
- 融资类型包括哪些
- 为什么摩托车还要用化油器
- 如何将python生成exe
- BTD是什么模式
- 卡罗拉是tnga架构吗
- 如何用Python编写应用程序
