一、Django文件上传处理
在Django中,文件上传时,实际文件数据存储在request.FILES
中。每个条目都是一个UploadedFile
对象,是对Python file对象的简单包装器,具有以下属性和方法:
HttpRequest.FILES
: 表单上传的文件对象存储在类字典对象request.FILES
中,表单格式需为multipart/form-data
。htmlCopy code<form enctype="multipart/form-data" method="post" action="/foo/"> <input type="file" name="image" /> </form>
获取上传文件的方式:pythonCopy codeimg = request.FILES['image']
UploadedFile
对象属性和方法:UploadedFile.read()
: 读取整个上传文件的数据,注意文件较大时慎用。UploadedFile.multiple_chunks(chunk_size=None)
: 判断文件是否足够大,一般为2.5M。UploadedFile.chunks(chunk_size=None)
: 返回一个生成器对象,用于逐块处理文件内容。
二、存储文件
- 将上传的文件存储在本地:
f = request.FILES['image'] with open('some/file/name.txt', 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk)
- 手动存储:
from django.core.files.base import ContentFile photo = request.FILES.get('photo', '') if photo: file_content = ContentFile(photo.read()) car.photo.save(photo.name, file_content) car.save()
三、简单文件上传实现
通过Django实现文件上传并保存到指定路径,无需使用Django的forms和models。以下是一个简单实现的示例:
# views.py from django.shortcuts import render from django.http import HttpResponse def upload_file(request): if request.method == "POST": File = request.FILES.get("myfile", None) if File is None: return HttpResponse("no files for upload!") else: with open("/tmp/%s" % File.name, 'wb+') as f: for chunk in File.chunks(): f.write(chunk) return HttpResponse("upload over!") else: return render(request, 'polls/upload.html')
四、基于表单上传文件
使用Django的Form
类处理表单,实例化处理和在模板中渲染,可以轻松完成表单需求。以下是创建一个简单的文件上传表单的示例:
# forms.py from django import forms class UploadFileForm(forms.Form): title = forms.CharField(max_length=50) file = forms.FileField()
在视图中使用该表单:
# views.py from django.shortcuts import render from django.http import HttpResponse from polls.forms import UploadFileForm def upload_file(request): if request.method == "POST": form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): handle_upload_file(request.FILES['file']) return HttpResponse('upload success!') else: form = UploadFileForm() return render(request, 'polls/upload.html', {'form': form})
五、同时上传多个文件
如果要同时上传多个文件,需要在FileField
的HTML标签中设置multiple
属性为True。以下是一个简单的示例:
# forms.py from django import forms class FileFieldForm(forms.Form): file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
在视图中处理多文件上传:
# views.py from django.views.generic.edit import FormView from .forms import FileFieldForm class FileFieldView(FormView): form_class = FileFieldForm template_name = 'upload.html' success_url = '...' def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = self.get_form(form_class) files = request.FILES.getlist('file_field') if form.is_valid(): for f in files: ... # Do something with each file. return self.form_valid(form) else: return self.form_invalid(form)
六、文件下载
实现文件下载功能,可采用HttpResponse
或StreamingHttpResponse
。以下是文件下载的几种实现方式:
- 简单文件下载功能:
from django.http import HttpResponse def download_file(request): with open('/tmp/file_name.txt', 'rb') as f: c = f.read() return HttpResponse(c)
- 更合理的文件下载功能(推荐使用
StreamingHttpResponse
):from django.http import StreamingHttpResponse def download_file(request): def file_iterator(file, chunk_size=512): with open(file, 'rb') as f: while True: c = f.read(chunk_size) if c: yield c else: break file = "file_name.txt" response = StreamingHttpResponse(file_iterator(file)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename="{0}"'.format(file) return response
七、示例: Django图片上传到数据库并调用显示
示例中包括模型的创建、数据库迁移、图片显示以及图片上传的处理。
# models.py from django.db import models class Test(models.Model): name = models.CharField(max_length=50) image = models.ImageField(upload_to='logo') def __str__(self): return self.name
配置MEDIA_URL
和MEDIA_ROOT
:
# settings.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
创建超级用户并使用Django后台管理进行图片上传。
在视图中获取图片数据:
# views.py from django.shortcuts import render def show_images(request): img = Test.objects.all() return render(request, 'home.html', {'img': img})
在模板中显示图片:
<!-- home.html --> {% for i in img %} <img src="{{ MEDIA_URL }}{{ i.image }}"> {% endfor %}
八、上传图片
创建一个简单的图片上传表单:
<!-- upload.html --> <form enctype="multipart/form-data" action="#" method="post"> {% csrf_token %} <input type="text" name="name"> <input type="file" name="logo"> <input type="submit" value="upload"> </form>
在视图中处理文件上传:
# views.py def upload_image(request): if request.method == 'POST': file = request.FILES['logo'] if file: new_img = Test( name=request.POST.get('name'), image=file ) new_img.save() return render(request, 'upload.html')
以上是对Django文件上传、下载、图片上传到数据库的简单示例的优化和整理。希望这些信息对你有帮助。
暂无评论内容