Django文件上传与下载教程

图片[1]-Django文件上传与下载教程-山海云端论坛

一、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): 返回一个生成器对象,用于逐块处理文件内容。

二、存储文件

  1. 将上传的文件存储在本地:f = request.FILES['image'] with open('some/file/name.txt', 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk)
  2. 手动存储: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)

六、文件下载

实现文件下载功能,可采用HttpResponseStreamingHttpResponse。以下是文件下载的几种实现方式:

  • 简单文件下载功能: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_URLMEDIA_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文件上传、下载、图片上传到数据库的简单示例的优化和整理。希望这些信息对你有帮助。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容