django+python大文件上传

大文件上传服务
一、前端
[webuploader](http://fex.baidu.com/webuploader/ ‘‘webuploader‘‘)
二、后端
django 2.0.0
这里只贴出核心的代码:
前端的:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--引入CSS-->
<link rel="stylesheet" type="text/css" href="https://cdn.staticfile.org/webuploader/0.1.1/webuploader.css">
<link rel="stylesheet" type="text/css" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.3/css/bootstrap.css">

<!--引入JS-->
<script type="text/javascript" src="https://cdn.staticfile.org/jquery/3.3.1/jquery.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/webuploader/0.1.1/webuploader.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/twitter-bootstrap/4.1.3/js/bootstrap.js"></script>
</head>
<body>
<div id="uploader" class="wu-example">
    <!--用来存放文件信息-->
    <div id="thelist" class="uploader-list"></div>
    <div class="btns">
        <div id="picker">选择文件</div>
        <button id="ctlBtn" class="btn btn-default">开始上传</button>
    </div>
    <div class="progress">         <!-- 进度条 -->
            <div class="progress-bar progress-bar-striped active" role="progressbar" style="width:0%;"></div>
        </div>
</div>
 <script type="text/javascript">
    $(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‘);
        });

    });
    </script>

</body>
</html>

后端的:
路由

    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())

效果图:

原文地址:http://blog.51cto.com/leizhu/2156243

时间: 2024-10-08 10:01:55

django+python大文件上传的相关文章

django 快速实现文件上传

前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对于web应用来说,包括数据库的创建,前端页面的开发,以及中间逻辑层的处理三部分. 本系列以可操作性为主,介绍如何通过django web框架来实现一些简单的功能.每一章都具有完整性和独立性.使用新手在动手做的过程中体会web开发的过程,过程中细节请参考相关文档. 本操作的环境: ==========

基于Nodejs的大文件上传之断点续传

接着<扒一扒Nodejs formidable的onPart>和<也说文件上传之兼容IE789的进度条---丢掉flash>:前面已完成兼容IE789的大文件上传:无flash的低版本进度条,高版本的分段上传,并已为断点续传做好铺垫: 说什么做好铺垫,原本以为Nodejs端已没问题,只剩前端依靠HTML5接着监听abort事件,保存中断时上传到第几块了(断点续传只支持文件比较大,然后意外上传中断了,暂时定50M开启断点续传吧),通过文件内容hash和该文件唯一上传token来记录断

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

Socket大文件上传

1 public sealed class SocketData 2 { 3 private SocketData() 4 { 5 } 6 7 public static SendFileMode SendFile(Socket socket, string fileName, int maxBufferLength) 8 { 9 SendFileMode flag = SendFileMode.Success; 10 try 11 { 12 using (Stream fs = new Fil

Python Selenium 文件上传(二)

今天补充一种文件上传的方法 主要是因为工作中使用SendKeys方法不稳定,具体方法见: Python Selenium 文件上传(一) 这种方法直接通过命令行执行脚本时没有问题,可以成功上传,但是如果通过saltstack 远程控制执行时,SendKeys就定位不到窗口了. 所以采用这种新的方式来实现文件上传功能,并完美的解决了这个问题. 具体操作步骤如下: 1.下载工具 AutoIt及使用 AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows

Python Selenium 文件上传(一)

昨天写了Web 文件下载的ui自动化,下载之后,今天就要写web 文件上传的功能了. 当然从折腾了俩小时才上传成功.下面写一下自己操作的步骤 首先网上说的有很多方法 如 input 标签的最好做了,直接定位到元素,然后再sendKeys("value")即可 <input id="file_name" class="text-1 w255" type="text" readonly="" value=

IIS中的大文件上传问题解决方法

IIS出于安全考虑限制了大文件的上传,而网上百度到的大部分解决方法都是用一个管理员权限的记事本打开一个文件修改参数,但是我发现里面根本没有网上所说的那些参数,最后自己找到了修改发布文件的webconfig的方法解决的IIS对大文件上传的限制. 首先在system.web中加入以下代码 [csharp] view plain copy <httpRuntime maxRequestLength="2097151"//最大上传长度 useFullyQualifiedRedirectU

Nodejs+HTML5兼容IE789的大文件上传完整版

业余将大文件上传重新梳理了一遍,后端基于Nodejs:有几个要点感觉很好玩: 兼容性:IE789为代表: 跨域上传:document.domain||middlePage: 多文件上传:input['type=file'] multiple: 拖拽上传:drag drop: 大文件分段:files.slice(s,e): 断点续传:localStorage: 接收分段的文件:formidable.onPart: 陆续写入分段文件:fs.write(fd,bf,offset,length,posi

Python WebDriver 文件上传(二)

今天补充一种文件上传的方法 主要是因为工作中使用SendKeys方法不稳定,具体方法见: Python WebDriver 文件上传(一) 这种方法直接通过命令行执行脚本时没有问题,可以成功上传,但是如果通过saltstack 远程控制执行时,SendKeys就定位不到窗口了. 所以采用这种新的方式来实现文件上传功能,并完美的解决了这个问题. 具体操作步骤如下: 1.下载工具 AutoIt及使用 AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Window