Django实现文件上传:HttpRequest.FILES详解与实践

3 下载量 149 浏览量 更新于2024-08-31 收藏 55KB PDF 举报
在Django中,文件上传是一个常见的功能需求,尤其是在处理用户提交的表单数据时。HttpRequest对象提供了对文件上传的专门支持,通过设置表单的enctype属性为'multipart/form-data',可以确保文件字段能够正确地被解析。文件上传的对象存储在request.FILES这个类字典中,其键对应于HTML表单中file输入字段的name属性。 当你构建一个带有文件上传表单的HTML结构,如: ```html <form enctype="multipart/form-data" method="post" action="/foo/"> <input type="file" name="image" /> </form> ``` 在后端处理请求时,可以通过以下方式访问上传的文件: ```python img = request.FILES['image'] ``` 这里的`img`变量就是UploadedFile类型的对象,它代表了上传的文件。UploadedFile是一个类,包含了以下重要的属性和方法: 1. `read()`:用于读取整个文件数据。尽管在大部分情况下可以使用,但要注意对于大文件,直接读取可能会消耗大量内存,不推荐。特别是当文件过大时,应避免一次性读取整个文件,而是使用`chunks()`方法。 2. `multiple_chunks(chunk_size=None)`:用于检查文件是否大到需要分块处理,通常一个标准的chunk大小可能是2.5MB。如果返回True,表示文件需要分块读取。 3. `chunks(chunk_size=None)`:返回一个生成器对象,可以迭代文件的每个数据块。在`multiple_chunks()`为True时,建议使用这个方法按块读取,以节省内存。 4. `name`:存储上传文件的原始名称,即用户在浏览器中选择文件时显示的名字。 5. `size`:上传文件的字节数,可用于获取文件大小。 6. `content_type`:文件上传时的MIME类型,如'text/plain'或'application/pdf'。 7. `charset`:文件内容的字符集,虽然在很多情况下可能不存在,但这是MIME类型的一部分,比如对于文本文件,它可能是编码类型。 在存储文件时,可以使用`UploadedFile`对象配合文件流(file-like object)操作,例如: ```python with open('some/file/name.txt', 'wb+') as destination: for chunk in img.chunks(): destination.write(chunk) ``` 这段代码会将上传的文件逐块写入到指定的本地文件中。 此外,Django还提供了内置的Form类,如`forms.FileField`或`forms.ImageField`,以便更方便地处理文件上传。创建一个名为`UploadFileForm`的Form,例如: ```python from django import forms class UploadFileForm(forms.Form): image = forms.FileField() ``` 这样,你可以轻松地在视图函数中接收和处理用户提交的文件,同时利用Django Form的验证和处理机制。Django提供了一套完整的工具来管理文件上传,确保了安全、可靠和易于扩展的文件处理能力。

优化一下下面的代码def FileUploads_modelform(request): """ 批量上传文件 方法三:采用modelform上传,超级简单,只需要实例化表单的时候 接收一下表单里边字符串数据和文件,然后利用表单的save()方法保存一下数据即可 :param request: :return: """ # 判断提交方式GET 或POST if request.method == 'POST': File_ModelForm = FileUpload_ModelForm(request.POST, request.FILES) # 实例化FileUploadForm表单,注意获取数据的方式 if File_ModelForm.is_valid(): # file = File_ModelForm.cleaned_data['file'] # 对于文件,自动保存 # 字段+上传路径自动保存到数据库 # file_form = File_ModelForm.save() # 保存表单到数据库 # 多属性保存 Upload_File = File_ModelForm.save(commit=False) # Upload_File.file_url = Upload_File.file_url.temporary_file_path() # 文件路径 # 调用get_optimized_file_type函数获取优化文件类型 # optimized_file_type = get_optimized_file_type(Upload_File.file_url) Upload_File.file_name = Upload_File.file_url.name # 文件名 Upload_File.file_size = Upload_File.file_url.size # 文件大小 Upload_File.file_update_author = request.user.realname # 获取文件类型 # Get the file content type uploaded_file_type, encoding = mimetypes.guess_type(Upload_File.file_url.path) Upload_File.file_type = uploaded_file_type # Upload_File.file_type = Upload_File.file_url.content_type # optimized_file_type = get_optimized_file_type(file_url) Upload_File.save() # 其他操作,例如返回成功页面或其他处理 # return render(request, 'zadmin/pages/File_Uploads.html', {'file_form': file_form}) return HttpResponse("文件上传成功!") else: file_form = FileUpload_ModelForm() return render(request, 'zadmin/pages/File_Uploads.html', {'file_form': file_form})

2023-07-15 上传