编程学习网 > 编程语言 > Python > django框架怎么上传到服务器?(django框架实现文件上传)
2022
09-26

django框架怎么上传到服务器?(django框架实现文件上传)

在框架中,对文件进行上传和下载是基本的操作,非常普遍。那么django框架怎么上传到服务器?接下来就给大家分享一下

在文件上传期间,实际文件数据存储在request.FILES中。此字典中的每个条目都是UploadedFile对象(或子类) – 上传文件的简单包装器。UploadedFile对象是对Python file对象的一个简单封装,并带有Django特定的附加功能。需要表示文件的时候,Django内部会使用这个类。UploadedFile对象拥有下列属性和方法:


HttpRequest.FILES  表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data 
<form enctype="multipart/form-data" method="post" action="/foo/">
<input type="file" name="image" />
request.FILES中的键来自于表单中的<input type="file" name="" />的name值:
img=request.FILES['image']
request.FILES中的值均为UploadedFile类文件对象。
UploadedFile对象
UploadedFile是类文件对象,具有以下方法和属性:
UploadedFile.read()读取整个上传文件的数据,文件较大时慎用。
UploadedFile.multiple_chunks(chunk_size=None)判断文件是否足够大,一般为2.5M
UploadedFile.chunks(chunk_size=None)返回一个生成器对象,当multiple_chunks()为True时应该使用这个方法来代替read().
UploadedFile.name上传文件的name。
UploadedFile.size传文件的大小。
UploadedFile.content_type 上传文件时的content_type报头,例如(e.g. text/plain or application/pdf).
UpladedFile.charset编码
 
UpladedFile.mode文件的读写模式。
UpladedFile.open([mode=None])打开或者重新打开文件(同时会执行File.seek(0))。mode参数的值和Python内建的open()相同。重新打开一个文件时,无论文件原先以什么模式打开,mode都会覆盖;None的意思是以原先的模式重新打开。
UpladedFile.write([content])将指定的内容字符串写到文件。取决于底层的储存系统,写入的内容在调用close()之前可能不会完全提交。
close()关闭文件。


除了这些列出的方法,File沿用了file对象的以下属性和方法:encoding、fileno、flush、isatty、newlines、read、readinto、readlines、seek、softspace、tell、truncate、writelines、xreadlines。

二、存储文件

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())   #创建File对象
    car.photo.save(photo.name, file_content)   #保存文件到car的photo域
    car.save()


三、简单文件上传实现

利用Django实现文件上传并且保存到指定路径下,其实并不困难,可以不需要用到django的forms,也不需要django的models,就可以简单实现上传功能。下面简单实现一下。

当Django在处理文件上传的时候,文件数据被保存在request.FILES。需要特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype=”multipart/form-data”时,表明不对字符进行编码,request.FILES中才会包含文件数据,否则request.FILES为空。

比如先写upload.html前台上传页面:


# ./polls/templates/polls/upload.html


<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>uploadFile</title>
</head>
<body>
    <form method="post" action="" enctype="multipart/form-data">
    {% csrf_token %}
       <label> 上传文件 </label>
       <input type="file" name="myfile" />
       <br/>
       <input type="submit" value="upload"/>
    </form>
</body>
</html>


然后写一个upload_file视图函数,处理文件上传,代码如下:

# ./polls/views


from django.shortcuts import render
from django.http import HttpResponse
 
def upload_file(request):
    # 请求方法为POST时,进行处理;
    if request.method == "POST":
        # 获取上传的文件,如果没有文件,则默认为None;
        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')


处理上传文件就是往服务器上生成一个文件,并将上传的文件内容写到新的文件中。然后写文件使用FILE.chunks()方法,而不是使用read()方法,能确保大文件并不会占用系统过多的内存。FILE方法和属性下面介绍。

最后写url路由:

# ./project_name/urls.py


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^polls/', include('polls.urls'))
]


# ./polls/urls.py


from django.conf.urls import url
from . import views
app_name = 'polls'
 
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^upload/$', views.upload_file, name='upload_file'),
]


选择文件就可以上传了

以上就是“django框架怎么上传到服务器?(django框架实现文件上传)”的详细内容,想要了解更多django框架内容欢迎持续关注编程学习

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取