文档章节

Django文件的上传与下载

芝麻糖人
 芝麻糖人
发布于 2016/12/12 13:58
字数 453
阅读 355
收藏 1

文件上传部分,直接上代码:

def uploadfile(request): #上传文件
    if request.method == 'POST':
        handle_uploaded_file(request.FILES.getlist("myfile",None))
        return HttpResponse("文件上传成功")
 
    return HttpResponse("Failed")

def handle_uploaded_file(files):
    if not os.path.exists('upload/'):
        os.mkdir('upload/')
    for file in files:
        # print file.name 
        with open('upload/' + file.name, 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)

接收前端post过来的filelist,将其一一以二进制方式写入到新文件中。

至于文件下载,我选用打包成zip文件的方式,这需要用到zipfile模块,所以要

import zipfile

正式代码如下:

def downloadzipfile(request):
    rootdir = 'download'
    the_file_name = "yourzip.zip" 
    z = zipfile.ZipFile(the_file_name, 'w',zipfile.ZIP_DEFLATED)
    for parent,dirnames,filenames in os.walk(rootdir):
        for file in filenames:
            z.write(rootdir + os.sep + file)
    z.close()        
    response = StreamingHttpResponse(file_iterator(the_file_name))
    response['Content-Type'] = 'application/zip'
    response['Content-Disposition'] = 'attachment; filename=yourzip.zip'
    return response 

def file_iterator(file_name, chunk_size=512):
    with open(file_name, 'rb') as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break   

可将Django项目目录下download文件夹里的文件打包为zip文件,并下载到本地,使用StreamingHttpResponse比HttpResponse更适合于文件的传输,不会因文件过大导致占用内存过大而崩溃。

有时文件有中文名会有bug,这种时候需要将代码修改为如下模样:

from django.utils.encoding import escape_uri_path
from django.http import HttpResponse
def test(request):
    file_name = '测试.txt'
    content = ...
    response = HttpResponse(content, content_type='application/octet-stream')
    response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(escape_uri_path(file_name))
    return response

Python文件打开方式:

 r : 以只读方式打开文件,文件不存在则出错

 w:以只写方式打开文件,文件存在则清空,不存在则建立

 a:以追加只写的方式打开,不清空文件,在文件末尾加入内容  

+: 有读写双权限。

r只有读的权限,w和a只有写的权限,w清空文件,a不清空文件。(read, write,append)

© 著作权归作者所有

共有 人打赏支持
芝麻糖人
粉丝 10
博文 20
码字总数 11932
作品 0
丰台
程序员
Django打造文件分享系统

本教程介绍如何使用Django框架快速打造文件分享系统,实现搜索功能,分享功能,用户分享文件查询。通过本课程,我们可以快速掌握Django的基础,以及一些ORM和View的高级用法。本课程适用于有...

实验楼
2017/12/22
0
0
[旧]使用DjangoUeditor在django中进行富文本开发

Django的安装和生成项目这里不介绍了。 DjangoUeditor下载地址:https://github.com/zhangfisher/DjangoUeditor 使用python setup.py install 安装, 推荐使用pip install DjangoUeditor安装...

子夜闻雪
2015/03/11
0
0
Django 开源相册组件介绍 django-photologue

一、安装与使用体验 在线体验地址:http://www.django-photologue.net/ 下载地址:https://github.com/jdriscoll/django-photologue 下载之后的安装: 解压文件包-找到setup.py所在文件路径,...

xiaoge2016
04/05
0
0
在django的admin使用ckeditor模块

首先在这个网站下载最新的django-ckeditor安装包: https://github.com/jeffh/django-ckeditor 然后解压缩,使用:python setup.py install安装,如果不是root用户,需要sudo 一。在你的解压缩...

岭南六少
2011/08/06
0
0
[转]使用Google App Engine Helper for Django

使用Google App Engine Helper for Django 原著: Matt Brown 译者: DaNmarner 原文链接: http://code.google.com/appengine/articles/appenginehelperfordjango.html 译文链接: http://d......

zting科技
2017/01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hive分区

hive为啥分区? hive为了避免全表扫描,从而引进分区技术来将数据进行划分。减少不必要数据的扫描,从而提高效率。 hive的分区和MySQL的分区的区别? mysql分区字段用的是表内字段;而hive分...

Mr_yul
25分钟前
1
0
log4j2发送消息至Kafka

title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知。做了一番调研后才发现log4j2默认有支持将日志发送到kaf...

微笑向暖wx
29分钟前
0
0
LINUX中如何查看某个端口是否被占用(转发)

LINUX中如何查看某个端口是否被占用 之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 33...

覃大光
今天
1
0
JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能

JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中。 JBolt的详细使用教程请移步到这里 =====版本1.5.0 更新内容 2018年10月13日10:41:52===== 注意...

山东-小木
今天
0
0
laravel 微信支付

1.composer加载laravel微信支付第三方文件 composer require "overtrue/laravel-wechat:~4.0" composer require simplesoftwareio/simple-qrcode 1.3.* //composer生成二维码文件 2.改confi......

vio小黑
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部