Django从0到1用uploadify实现文件上传功能

本人环境 Debian Django 1.11 uploadify官网下载最新版。

uploadify官网demo写的很简单。而且不是基于django的,所以可能要花些时间做些研究,我去网上搜了django uploadify,发现介绍的都很简单,而且最关键的坑都没指出来。之前自己用过uploadify,成功过,后来过了很久再做,还是花了几个小时才配置成功,所以,这次一定要详细记录碰到的坑。

直接上代码,有问题可留言讨论。
html需要添加核心代码:



关键的参数 uploader 和 swf,其他可照抄。
uploader是服务器脚本位置 可以用url方式写,也可以用/upload_script/写试试。不要用官网demo的php脚本。
不过切记,这里的url是在你的Django最顶层的url里面写的,因为我的服务器脚本是在invest app里的view写的,那你需要在最顶层的url这么写。

顶层url文件,需要添加:

from invest import views
url(r'^upload_script/$', views.uploadify_script, name='uploadify_script'),

刚开始是在invest app里的url填的这些,运行报错
Reverse for 'uploadify_script' not found. 'uploadify_script' is not a valid view function or pattern name.百思不得其解。后来还是看自己之前的写的程序,发现在顶层写的,后来再回过头来看,这个报错,其实已经说得很清楚了,就是url没有配置,但是我确实配置了,说明配置的地方不对,其实还是敏感度不够。
注意,url写法,后面跟的是name,链接用的是/upload_script/。

view.py需添加:

import os
import uuid
from django.views.decorators.csrf import csrf_exempt, csrf_protect

def save_uploaded_file(f, filename):
    destination = open(filename, 'wb')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()
def multiFileUpload(fileContent):
    addr = str(uuid.uuid3(uuid.NAMESPACE_OID, str(fileContent.name)))
    path = os.path.join(static_path, addr)
    if not os.path.exists(path):
        os.mkdir(path)
    filename = os.path.join(path, fileContent.name)
    new_name = filename
    save_uploaded_file(fileContent, filename)

    return (True,new_name)

    
@csrf_exempt
def uploadify_script(request):
    print 'upload..........'
    ret="0"  
    new_name = ''
    #request.FILES['data']
    filename = request.FILES.get("Filedata",None)
    # if request.FILES and request.FILES['Filedata']:
    #   print request.FILES['Filedata'].name
    # print 'here'
    # filename = request.FILES['Filedata'].name
    print 'filename '+filename.name
    if filename:
        result,new_name=file_upload(filename)
        if result:
            ret="1"
        else:
            ret="2"
    import json            
    source={'ret':ret,'save_name':new_name}
    print source
    return HttpResponse(json.dumps(source))
  
  
def file_upload(filename):  
    '''''文件上传函数'''  
    if filename:
        print 'file_upload'
        path=os.path.join(static_path,'upload')
        if not os.path.exists(path):
            os.mkdir(path,0755)
        print path
        #file_name=str(uuid.uuid1())+".jpg"  
        file_name=str(uuid.uuid1())+'-'+filename.name
        #fname = os.path.join(settings.MEDIA_ROOT,filename)
        path_file=os.path.join(path,file_name)
        print file_name
        print path_file
        fp = open(path_file, 'wb')
        for content in filename.chunks():
            fp.write(content)
        fp.close()
        return (True,file_name) #change
    return (False,file_name)   #change
  
#用户管理-添加用户-删除附件  
 
@csrf_exempt
def file_delete(request):  
    del_file=request.POST.get("delete_file",'')  
    if del_file:  
        path_file=os.path.join(settings.MEDIA_ROOT,'upload',del_file)  
        os.remove(path_file)

另一个是windows和linux的路径写法不同,以及创建目录的方法略有不同,linux需要加上权限参数,windows不需要。
windows:
static_path = 'j:\work_netease\my_site\web_performance\draw\static\pic'
if not os.path.exists(path):
os.mkdir(path)

linux:
static_path = '/home/website/demo/mysite/invest/static/'
if not os.path.exists(path):
os.mkdir(path,0755)

name 'csrf_exempt' is not defined
Django官网搜csrf_exempt 可以很容易找到这一行
from django.views.decorators.csrf import csrf_exempt, csrf_protect

关于最前面的swfobject.js,那他究竟是什么呢?
最近看到了好几个Flash网站,head代码里都加载了一个swfobject.js,这个JS究 竟有什么作用呢?眼下正在做一个Web页面,说不定刚好可以派上用场。于是,好奇的搜索了一下。原来这是老外开发的,用于在HTML中方面插入Adobe Flash媒体资源(*.swf文件)的独立、敏捷的JavaScript模块,该模块中的JavaScript脚本能够自动检测PC、Mac机器上各种 主流浏览器对Flash插件的支持情况。目前最新的版本是2.2,这里可以下载最新版的SWFObject。

你可能感兴趣的:(Django从0到1用uploadify实现文件上传功能)