Django   发布时间:2022-04-10  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Django实现任意文件上传(最简单的方法)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

<div id="article_content" class="article_content csdn-tracking-statistics" style="overflow: hidden;" data-mod="popu_519" data-dsm="post">

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

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

<div class="dp-highlighter bg_html">@H_675_7@ <div class="bar">@H_675_7@ <div class="tools">[html] <a class="Viewsource" title="view plain" onclick="dp.sh.Toolbar.Command('Viewsource',this);return false;" href="#">view plain<span class="tracking-ad" data-mod="popu_168"><span class="tracking-ad" data-mod="popu_168"> <a class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="#">copy@H_675_7@ <div style="position: absolute; left: 261px; top: 352px; width: 16px; height: 16px; z-index: 99;"><object id="ZeroClipboardMovie_1" width="16" height="16" align="middle" bgcolor="#ffffff" data="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash">

@H_675_7@ <span class="tracking-ad" data-mod="popu_169"> <a class="Printsource" title="print" onclick="dp.sh.Toolbar.Command('Printsource',this);return false;" href="#">print<a class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" href="#">?

    ===@H_607_60@
  1. ==@H_607_60@
  2. @H_607_60@
  3. ==@H_607_60@
  4. @H_607_60@
       

@H_675_7@

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

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

<div class="dp-highlighter bg_python">@H_675_7@ <div class="bar">@H_675_7@ <div class="tools">[python] <a class="Viewsource" title="view plain" onclick="dp.sh.Toolbar.Command('Viewsource',this);return false;" href="#">copy@H_675_7@ <div style="position: absolute; left: 277px; top: 627px; width: 16px; height: 16px; z-index: 99;"><object id="ZeroClipboardMovie_2" width="16" height="16" align="middle" bgcolor="#ffffff" data="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash">

<span class="tracking-ad" data-mod="popu_169"> <a class="Printsource" title="print" onclick="dp.sh.Toolbar.Command('Printsource',this);return false;" href="#">?

    upload_file(request):@H_607_60@
  1. request.method==String">"POST":@H_607_60@
  2. @myFile=request.FILEs.get(String">"myfile",)默认为None@H_607_60@
  3. @H_200_34@myFile:@H_607_60@
  4. returnhttpResponse(String">"nofilesforupload!")@H_607_60@
  5. desTination=open(os.path.join(String">"E:\\upload",myFile.Name),String">'wb+')@H_607_60@
  6. chunk@H_200_34@myFile.chunks():@H_607_60@
  7. desTination.write(chunk)@H_607_60@
  8. desTination.close()@H_607_60@
  9. returnhttpResponse(String">"uploadover!")@H_607_60@
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",'wb+')    # 打开特定的文件进行二进制的写操作
        for chunk in myFile.chunks():      # 分块写入文件
            desTination.write(chunk)
        desTination.close()
        returnhttpResponse("upload over!")

代码就是上面这些。

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

首先,对于上传的文件,然是通过POST的方式上传的,但是不能通过request.POST["myfile"]或者request.POST.get("myfile",NonE),这两种方式来访问,这里需要使用另外一种方式,就是:

request.FILES["myfile"]或者request.FILEs.get("myfile",NonE)

因为上传的文件是保存在FILES这个字典中的,可以在if request.method =="POST"之前加上一句assert false,再运行浏览器,就可以看到结果。

@H_675_7@

接下来,需要判断用户是不是真的上传了文件,如果用户仅仅只是点了 一下upload按键,那么就提示他没有上传文件。

@H_675_7@

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

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

比如可以将上传的123.exe文件,保存为abc.txt,但是这毫无意义,对于上传的123.exe,在服务器上也应该是123.exe。其实在这里所说的abc.txt和123.exe的内容是完全一样的,只需要将abc.txt的文件后缀改为exe就行了。

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

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

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

@H_321_9@myFile.multiple_chunks():这个方法根据myFile的大小,返回True或者false,当myFile文件大于2.5M(默认为2.5M,可以调整)时,该方法返回True,否则返回false,因此可以根据该方法来选择选用read方法读取还是采用chunks方法:

if myFile.multiple_chunks() == false:

# 使用myFile.read()

else:

# 使用myFile.chunks()

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

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

接下来的一行代码是:

desTination = open(os.path.join("E:\\upload",'wb+')

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

for chunk in myFile.chunks(): # 分块写入文件

desTination.write(chunk)

数据写完之后关闭文件就可以了,desTination.close()。

@H_675_7@

首先选择文件:

@H_675_7@

点击upload,显示upload over!

@H_675_7@

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

                </div>

大佬总结

以上是大佬教程为你收集整理的Django实现任意文件上传(最简单的方法)全部内容,希望文章能够帮你解决Django实现任意文件上传(最简单的方法)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:
猜你在找的Django相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap