django 上传文件夹_django上传文件

template html(模板文件):

有如下一个form:

from django importformsclassUploadFileForm(forms.Form):

title= forms.CharField(max_length=50)

file= forms.FileField()

处理这个form的视图收到了在request.FILES中的文件数据。从上述form来的数据可以通过request.FILES['file']来存取。

特别注意的是,只有当request方法是POST,且发送request的

有属性enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空。

以下视图函数:

from django.http importHttpResponseRedirectfrom django.shortcuts importrender_to_responsefrom somewhere importhandle_uploader_filedefupload_file(request):if request.method == 'POST':

form=UploadFileForm(request.POST, request.FILES)ifform.is_valid():

handle_uploaded_file(request.FILES['file'])return HttpResponseRedirect('/success/url')else:

form=UploadFileForm()return render_to_response('upload.html', {'form': form})

必须要将request.FILES传给form的构造函数,才能将文件数据绑定到form.

处理上传文件

字典request.FILES中的每一个条目都是一个UploadFile对象。UploadFile对象有如下方法:

1、UploadFile.read():

从文件中读取全部上传数据。当上传文件过大时,可能会耗尽内存,慎用。

2、UploadFile.multiple_chunks():

如上传文件足够大,要分成多个部分读入时,返回True.默认情况,当上传文件大于2.5M时,返回True。但这一个值可以配置。

3、UploadFile.chunks():

返回一个上传文件的分块生成器。如multiple_chunks()返回True,必须在循环中使用chrunks()来代替read()。一般情况下直接使用chunks()就行。

4、UploadFile.name():上传文件的文件名

5、UplaodFile.size():上传文件的文件大小(字节)

由上面的说明可以写出handle_uploaded_file函数

defhandle_uploaded_file(f):

destination= open('some/file/name.txt', 'wb+')for chunk inf.chunks():

destination.write(chunk)

destination.close()

详细点:

defhandle_uploaded_file(f):

file_name= ""

try:

path= "media/editor" + time.strftime('/%Y/%m/%d/%H/%M/%S/')if notos.path.exists(path):

os.makedirs(path)

file_name= path +f.name

destination= open(file_name, 'wb+')for chunk inf.chunks():

destination.write(chunk)

destination.close()exceptException, e:printereturn file_name

上传文件保存的位置

保存上传文件前,数据需要存放在某个位置。默认时,当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。意味着保存文件只有一次从内存读取,一次写磁盘。

但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。

改变upload handler的行为

三个设置控制django文件上传的行为:

FILE_UPLOAD_MAX_MEMORY_SIZE:直接读入内存的最大上传文件大小(字节数)。当大于此值时,文件存放到磁盘。默认2.5M字节

FILE_UPLOAD_TEMP_DIR

FILE_UPLOAD_PERMISSIONS:权限

FILE_UPLOAD_HANDLERS

上传文件真正的处理器。修改此项设置可以完成自定义django上传文件的过程。

默认是:

("django.core.files.uploadhandler.MemoryFileUploadHandler","django.core.files.uploadhandler.TemporaryFileUploadHandler",)

先尝试装入内存,如不行就存入到临时文件。

上传文件封装方法:

'''文件上传'''

defhandle_uploaded_file(f):

file_name= ""

try:

path= "media/image" + time.strftime('/%Y/%m/%d/%H/%M/%S/')if notos.path.exists(path):

os.makedirs(path)

file_name= path +f.name

destination= open(file_name, 'wb+')for chunk inf.chunks():

destination.write(chunk)

destination.close()exceptException, e:printereturn file_name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中,上传文件需要进行以下步骤: 1. 定义一个文件上传表单 在 HTML 表单中添加 enctype="multipart/form-data" 属性,以便支持文件上传。 ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfolder" webkitdirectory directory multiple> <button type="submit">上传</button> </form> ``` 注意:需要将 input 标签的属性设置为 webkitdirectory directory multiple,以支持上传文件。 2. 在视图函数中处理文件上传 在视图函数中获取上传的文件,并将其保存到项目文件下。可以使用 Python 的 os 模块来处理文件的创建和文件的复制。 ```python import os def upload(request): if request.method == 'POST' and request.FILES['myfolder']: myfolder = request.FILES['myfolder'] folder_path = os.path.join('media', myfolder.name) os.makedirs(folder_path, exist_ok=True) for file in myfolder: file_path = os.path.join(folder_path, file.name) with open(file_path, 'wb+') as destination: for chunk in file.chunks(): destination.write(chunk) return render(request, 'upload.html') return render(request, 'upload.html') ``` 3. 显示上传后的文件上传文件成功后,可以将其显示给用户。可以在模板中使用上传文件的路径。 ```html {% if folder_path %} <p>上传成功!</p> <p>文件位置: {{ folder_path }}</p> {% endif %} ``` 注意:需要在 settings.py 文件中设置 MEDIA_ROOT 和 MEDIA_URL,以便访问上传的文件。 ```python MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值