Django上传大文件413

博客主要围绕上传文件大小限制展开。上传大文件时会出现413错误,Django默认上传文件大小为2.5M,可修改settings.py调整。但通过nginx部署时,修改settings.py不起作用,需修改nginx相关配置,如在ubuntu系统进行相应修改。

更多精彩内容:http://www.codeye.top http://blog.codeye.top

更改上传文件大小限制

上传大文件,出现413错误(Payload too large).Django 官方文档显示如下:

Django官方文档
enter image description here

默认上传文件大小是2.5M,小于时,放在内存中。大于时放在磁盘里。通过修改settings.py可以满足文件上传大小:


FILE_UPLOAD_MAX_MEMORY_SIZE = 26214400  #上传文件大小,改成25M
DATA_UPLOAD_MAX_MEMORY_SIZE = 26214400	#上传数据大小,也改成了25M

nginx部署

通过nginx部署时,这种方式貌似就不起作用了。这时需要修改nginx的相关配置。
再ubuntu系统,修改如下

# vi /etc/nginx/site-available/default

enter image description here

Django实现大文件上传,需要注意表单设置、文件读取和存储方式。以下是实现大文件上传的步骤和方法: ### 表单设置 文件上传所在的表单需要满足两个条件:提交方式必须是`post`,表单必须提供一个`enctype`属性,且该值必须为`multipart/form-data`,它代表以流的形式提交表单的数据[^1]。 示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/doUpload/" method="post" enctype="multipart/form-data"> {% csrf_token %} <p>文件 <input type="file" name="file"></p> <p><input type="submit" value="上传"></p> </form> </body> </html> ``` ### 视图处理 在Django视图中处理大文件上传时,要避免将大文件全部读入内存,可使用`chunks()`方法分块读取文件并写入磁盘。 示例代码如下: ```python from django.http import HttpResponse from django.shortcuts import render # 处理上传文件的函数 def upload(request): if request.method == "POST": print(request.FILES) print(request.FILES["upload_file"].name) # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值 filename = request.FILES["upload_file"].name # 在项目目录下新建一个文件 with open(filename, "wb") as f: # 从上传的文件对象中一点一点读 for i in request.FILES["upload_file"].chunks(): # 写入本地文件 f.write(i) return HttpResponse("上传OK") else: return render(request, "upload.html") ``` ### 根据文件大小选择读取方式 可以使用`multiple_chunks()`方法判断文件大小,根据返回结果选择合适的读取方法。当文件大于2.5M(默认值,可调整)时,`multiple_chunks()`返回`True`,此时使用`chunks()`方法;否则使用`read()`方法。 示例代码如下: ```python from django.conf import settings import os from django.http import HttpResponse # 文件上传处理 def doUpload(req): file = req.FILES.get(&#39;file&#39;) savePath = os.path.join(settings.MEDIA_ROOT, file.name) with open(savePath, &#39;wb&#39;) as f: if file.multiple_chunks(): for myf in file.chunks(): f.write(myf) print(&#39;大于2.5&#39;) else: print(&#39;小于2.5&#39;) f.write(file.read()) return HttpResponse(&#39;文件上传&#39;) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值