python post上传大文件分片上传_django+python大文件上传

本文介绍了如何使用Django 2.0.0和WebUploader库实现前端后端配合进行大文件的分片上传。前端通过WebUploader控件进行文件选择并分片上传,每片文件上传时携带任务ID,后端接收到分片后保存,并在所有分片上传完成后进行合并。当所有分片上传成功后,前端会发送请求通知后端进行文件合并,并删除分片,完成上传过程。
摘要由CSDN通过智能技术生成

大文件上传服务

一、前端

[webuploader](http://fex.baidu.com/webuploader/ ''webuploader'')

二、后端

django 2.0.0

这里只贴出核心的代码:

前端的:

Title
选择文件

开始上传

$(document).ready(function() {

var task_id = WebUploader.Base.guid(); //产生task_id

var uploader = WebUploader.create({ //创建上传控件

swf: 'https://cdn.staticfile.org/webuploader/0.1.1/Uploader.swf', //swf位置,这个可能与flash有关

server: '/resource/files/upload/', //接收每一个分片的服务器地址

pick: '#picker', //填上传按钮的id选择器值

auto: true, //选择文件后,是否自动上传

chunked: true, //是否分片

chunkSize: 10 * 1024 * 1024, //每个分片的大小,这里为10M

chunkRetry: 3, //某分片若上传失败,重试次数

threads: 1, //线程数量,考虑到服务器,这里就选了1

duplicate: true, //分片是否自动去重

formData: { //每次上传分片,一起携带的数据

task_id: task_id,

},

});

uploader.on('startUpload', function() { //开始上传时,调用该方法

$('.progress-bar').css('width', '0%');

$('.progress-bar').text('0%');

});

uploader.on('uploadProgress', function(file, percentage) { //一个分片上传成功后,调用该方法

$('.progress-bar').css('width', percentage * 100 - 1 + '%');

$('.progress-bar').text(Math.floor(percentage * 100 - 1) + '%');

});

uploader.on('uploadSuccess', function(file) { //整个文件的所有分片都上传成功,调用该方法

//上传的信息(文件唯一标识符,文件名)

var data = {'task_id': task_id, 'filename': file.source['name'] };

$.get('/resource/upload/complete/', data); //ajax携带data向该url发请求

$('.progress-bar').css('width', '100%');

$('.progress-bar').text('上传完成');

});

uploader.on('uploadError', function(file) { //上传过程中发生异常,调用该方法

$('.progress-bar').css('width', '100%');

$('.progress-bar').text('上传失败');

});

uploader.on('uploadComplete', function(file) {//上传结束,无论文件最终是否上传成功,该方法都会被调用

$('.progress-bar').removeClass('active progress-bar-striped');

});

});

后端的:

路由

path('files/upload/', views.fileupload,name='图片分片上传'),

path('upload/complete/', views.fileMerge,name='上传成功合并'),

视图:

@csrf_exempt

def fileupload(request):

if request.method == 'POST':

upload_file = request.FILES.get('file')

task = request.POST.get('task_id') # 获取文件唯一标识符

chunk = request.POST.get('chunk', 0) # 获取该分片在所有分片中的序号

filename = '%s%s' % (task, chunk) # 构成该分片唯一标识符

print("filename=",filename)

default_storage.save('./upload/%s' % filename,ContentFile(upload_file.read())) # 保存分片到本地

return render_to_response('upload.html',locals())

@csrf_exempt

def fileMerge(request):

print(request.GET)

task = request.GET.get('task_id')

ext = request.GET.get('filename', '')

upload_type = request.GET.get('type')

if len(ext) == 0 and upload_type:

ext = upload_type.split('/')[1]

ext = '' if len(ext) == 0 else '.%s' % ext # 构建文件后缀名

chunk = 0

with open('./upload/%s%s' % (task, ext), 'wb') as target_file: # 创建新文件

while True:

try:

filename = './upload/%s%d' % (task, chunk)

source_file = open(filename, 'rb') # 按序打开每个分片

target_file.write(source_file.read()) # 读取分片内容写入新文件

source_file.close()

except IOError:

break

chunk += 1

os.remove(filename) # 删除该分片,节约空间

return render_to_response('upload.html',locals())

效果图:

94607ef02910b69959e59c6a611fa2df.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值