Django实现任意文件上传(最简单的方法)

利用Django实现文件上传而且保存到指定路径下,其实并不困难,彻底不须要用到django的forms,也不须要django的models,就能够实现,下面开始实现。html

第一步:在模板文件中,建立一个form表单,须要特别注意的是,在有文件上传的form表单中,method属性必须为post,并且必须指定它的enctype为"multipart/form-data",代表不对字符进行编码,具体的代码以下:python

1
2
3
4
5
< form  enctype="multipart/form-data" action="/uploadFile/" method="post">
    < input  type="file" name="myfile" />
    < br />
    < input  type="submit" value="upload"/>
</ form >

第二步:设置urls.py文件,指定相应的视图函数进行处理django

第三步:最重要的,在视图函数中作处理,先把代码贴出来,一共就这么点,能够实现任何格式文件的上传浏览器

 

1
2
3
4
5
6
7
8
9
10
def  upload_file(request): 
     if  request.method  = =  "POST" :     # 请求方法为POST时,进行处理 
         myFile  = request.FILES.get( "myfile" None )     # 获取上传的文件,若是没有文件,则默认为None 
         if  not  myFile: 
             returnHttpResponse( "no files for upload!"
         destination  =  open (os.path.join( "E:\\upload" ,myFile.name), 'wb+' )     # 打开特定的文件进行二进制的写操做 
         for  chunk  in  myFile.chunks():       # 分块写入文件 
             destination.write(chunk) 
         destination.close() 
         returnHttpResponse( "upload over!"

  

代码就是上面这些。服务器

这里须要对上面视图函数中的代码进行详细的解释一番:app

首先,对于上传的文件,虽然是经过POST的方式上传的,可是不能经过request.POST["myfile"]或者request.POST.get("myfile", None),这两种方式来访问,这里须要使用另一种方式,就是:函数

           request.FILES["myfile"]或者request.FILES.get("myfile", None)post

由于上传的文件是保存在FILES这个字典中的,能够在if request.method =="POST"以前加上一句assert False,再运行浏览器,就能够看到结果。网站

接下来,须要判断用户是否是真的上传了文件,若是用户仅仅只是点了 一下upload按键,那么就提示他没有上传文件。编码

 

下面是最重要的部分,如今已经获得了文件了,可是文件在内存中,没有写到硬盘里面去,接下里须要完成的就是把文件写入到硬盘,那到底该怎么写,我看了不少人的博客,写的云里雾里的,都没有说清楚,把我搞糊涂了。

其实上传文件,就是把硬盘里面某个文件的数据,写入到服务器指定的文件中,在最底层无论是txt文件仍是exe文件等,全都是二进制的数据,这里所要作的只是将已经上传了的文件的数据,以二进制的方式写入到服务器指定的文件中,这个文件能够随意命名。

好比能够将上传的123.exe文件,保存为abc.txt,可是这毫无心义,对于上传的123.exe,在服务器上也应该是123.exe。其实在这里所说的abc.txt和123.exe的内容是彻底同样的,只须要将abc.txt的文件后缀改成exe就好了。

 

在进行进一步的代码解释以前,须要先讲几个关于上传文件的方法和属性:

    myFile.read():从文件中读取整个上传的数据,这个方法只适合小文件;

    myFile.chunks():按块返回文件,经过在for循环中进行迭代,能够将大文件按块写入到服务器中;

   myFile.multiple_chunks():这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为2.5M,能够调整)时,该方法返回True,不然返回False,所以能够根据该方法来选择选用read方法读取仍是采用chunks方法:

1
2
3
4
5
6
7
if  myFile.multiple_chunks()  = =  False :
 
    # 使用myFile.read()
 
else :
 
    # 使用myFile.chunks()

  

   myFile.name:这是一个属性,不是方法,该属性获得上传的文件名,包括后缀,如123.exe;

   myFile.size:这也是一个属性,该属性获得上传文件的大小。

 

接下来的一行代码是:

1
destination  =  open (os.path.join( "E:\\upload" ,myFile.name),  'wb+' )

  

这一行代码须要用到os模块,import os。对于os.path.join("E:\\upload", myFile.name),若是上传的文件为123.exe,那么将获得E:\\upload\\123.exe这个路径,以写二进制的方式打开这个文件。接下来是分块写入数据:

1
2
3
for  chunk  in  myFile.chunks():       # 分块写入文件
 
    destination.write(chunk)

  

数据写完以后关闭文件就能够了,destination.close()。

 

首先选择文件:

点击upload,显示upload over!

查看指定目录下是否有相应的上传文件:

 

 

 

补充:


urlpatterns = [
url(r'^$', app1_views.index), #网站页面
url(r'^uploadFile/$', app1_views.upload_file), #上传函数
url(r'^admin/', admin.site.urls),
]

 

 

转载自https://www.cnblogs.com/huchong/p/7910131.html#navigator

相关文章
相关标签/搜索