上传就这么六步!

一、

settings配置文件中配置

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace('\\', '/')#media即为图片上传的根路径

二、

url路由中配置

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index,name='index'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #如果单纯的是上传,文件并不用来显示或者读取,就不用加这个

三、

models.py文件中的写法

class Book(models.Model):

    name = models.CharField(max_length=32)
date1 = models.DateTimeField(auto_now=True,null=True)
date2 = models.DateTimeField(auto_now_add=True,null=True)
img = models.ImageField(upload_to='img',null=True) #写上upload_to,后面指定一个路径,那么将来上传的文件会直接生成到配置文件中的那个medias文件夹中的img文件夹中,不需要我们自己写读取文件内容写入本地文件的操作,django内部帮我们自动处理了

四、

views视图函数中的写法,上传一个图片:

def index(request):

    if request.method == 'POST':
print(request.POST)
username = request.POST.get('username')
print('files',request.FILES)
file_obj = request.FILES.get('file')
models.Book.objects.create(
name=username,
img=file_obj,
) #自动就会将文件上传到我们配置的img文件夹中
return render(request,'index.html')

五、

更新上传了的文件(注意,只是会更新数据库中那个字段保存的文件的路径,但是之前上传的文件是不会被自动删除的,需要我们自行再写逻辑来删除之前上传错的或者需要被覆盖的文件。还有就是如果上传的文件名称是相同的那么你会发现数据库中这个字段的路径后面的文件名称会出现一个乱起八糟的随机字符串,这是因为上传的文件名称冲突了,django为了解决这个冲突,给你改了一下你的文件名称。)

obj = models.Book.objects.get(name='chao2')
obj.img=file_obj
obj.save() #下面的update方法是不能更新正确更新保存的文件路径的,除非我们自己手动拼接文件路径,然后img=路径来进行update更新
models.Book.objects.filter(name='chao2').update(img=file_obj)

六、

查看已经上传了的文件(就需要借助我们上面在settings配置文件中和url中的配置了)

views.py视图函数的写法:

def index(request):
objs = models.Book.objects.all()
return render(request,'index.html',{'objs':objs})

index.html文件中的写法:

<div>
{% for obj in objs %}
<img src="/media/{{ obj.img }}" alt="">
{% endfor %} </div>
<div>
{% for obj in objs %}
<img src="/media/{{ obj.img }}" alt="">
<!--<img src="/media/{{ obj.img.name }}" alt="">-->
{% endfor %} </div>

下载

在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载。

我们这里介绍三种Django下载文件的简单写法,然后使用第三种方式,完成一个高级一些的文件下载的方法

index.html内容如下

<div>
<a href="{% url 'download' %}">文件下载</a>
</div>

urls.py文件内容如下:

urlpatterns = [

    url(r'^index/', views.index,name='index'),
url(r'^download/', views.download,name='download'), ]

view视图函数的写法有一下三种:

方式1:

from django.shortcuts import HttpResponse
def download(request):
file = open('crm/models.py', 'rb') #打开指定的文件
response = HttpResponse(file) #将文件句柄给HttpResponse对象
response['Content-Type'] = 'application/octet-stream' #设置头信息,告诉浏览器这是个文件
response['Content-Disposition'] = 'attachment;filename="models.py"' #这是文件的简单描述,注意写法就是这个固定的写法
return response

  注意:HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储城字符串,然后返回给客户端,同时释放内存。可以当文件变大看出这是一个非常耗费时间和内存的过程。而StreamingHttpResponse是将文件内容进行流式传输,数据量大可以用这个方法

方式2:

from django.http import StreamingHttpResponse #
def download(request):
file=open('crm/models.py','rb')
response =StreamingHttpResponse(file)
response['Content-Type']='application/octet-stream'
response['Content-Disposition']='attachment;filename="models.py"'
return response

方式3:

from django.http import FileResponse
def download(request):
file=open('crm/models.py','rb')
response =FileResponse(file)
response['Content-Type']='application/octet-stream'
response['Content-Disposition']='attachment;filename="models.py"'
return response

三种

三种http响应对象在django官网都有介绍.入口:https://docs.djangoproject.com/en/1.11/ref/request-response/

推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse的子类,内部使用迭代器进行数据流传输。

16.Django学习之文件上传和下载的更多相关文章

  1. JavaWeb学习总结——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  2. Struts2学习总结——文件上传与下载

    Struts2文件上传与下载 1.1.1新建一个Maven项目(demo02) 在此添加Web构面以及 struts2 构面 1.2.1配置Maven依赖(pom.xml 文件) <?xml v ...

  3. javaWeb学习总结——文件上传、下载

    目录 1.文件上传环境搭建 2.文件上传代码实现 3.关于下载 @ 嘿,熊dei,你不得不知道在Web开发中,文件上传和下载功能是非常常用的功能,关于文件上传,浏览器上传[文件以流的形式传输]--&g ...

  4. Django学习之文件上传

    就这么六步! 一.settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace ...

  5. 1.6(Spring MVC学习笔记)文件上传与下载

    一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...

  6. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  8. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

随机推荐

  1. 「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈

    题目描述 夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的 ...

  2. CSP-S 95 (sb lsc yy赛)

    sb lsc 终于改完题了!(心力交悴.png)

  3. Python openpyxl Excel绘制柱形图

    这是一份openpyxl的使用指南. 大体内容翻译自官网 https://openpyxl.readthedocs.io/en/stable/charts/bar.html#vertical-hori ...

  4. mysql查询不重复的行内容,不重复的记录数.count,distinct

    有这么一个表 记录了id, p_id, p_name , p_content , p_time 1  343        aaa            aaaaaa   2012-09-01 2   ...

  5. nuxt遇到的问题(一)window 或 document is not defined

    因为用了VUE做的官网,既然是官网了避免不了SEO的问题了(该死当初就不应该选择用vue) 很自然就是选择了使用nuxt.js来做ssr预渲染了. 因为网站不是响应式的,PC / 移动端要进行对应跳转 ...

  6. linux命令指令

    1.ls显示目录内容 -a 显示目录下所有文件 -l 显示详细信息 ls *.c  列出当前目录所有的.c文件 2.uname -a  查看内核版本 3.whoami  查看谁登陆虚拟机 4.cd 切 ...

  7. Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法

    今天提交代码报错,看了看提示的错误,百度了一下,发现操作都比较繁琐,所以自己重新给一个最简单有效的. 有的要下载sqlite3.exe,借助它清空本地.svn\wc.db数据库文件里面的operati ...

  8. 根据本地ip获取地理位置,再根据地理位置,获取天气

    import json,requestsfrom urllib.request import urlopenfrom pyquery import PyQuery as pqfrom lxml imp ...

  9. Django使用mysql数据的流程

    创建一个mysql数据库 1.打开终端(cmd): 输入: mysql -uroot -p 密码:*** 输入: create database 数据库名字; 2.在settings中进行配置 DAT ...

  10. spring日志体系浅析(spring 5.x)

    日志是进行软件开发必不可少的一项功能,目前流行着很多开源日志库,比如log4j.log4j2.logback.JDK Logging.commons-logging.slf4j等. 几种日志产品的介绍 ...