0

我创建了一个使用和上传文件的no javascript代码。它使用一个元素来选择文件。单击按钮后,文件上传没有任何问题。django 视图可以从中获取文件html formdjango viewhtml5 inputsubmitrequest.FILES

def upload_file(request,template_name):
    to_return = {}
    store_message="failure"
    if request.method == 'POST':
        if request.FILES.has_key('fselect'):
            file = request.FILES['fselect']
            with open('/uploadpath/%s' % file.name, 'wb+') as dest:
                for chunk in file.chunks():
                    dest.write(chunk)
            store_message="success"
    to_return['store_message']= store_message
    if store_message == "failure":
        return redirect('home')
    reqctx = RequestContext(request,to_return)
    return return render_to_response(template_name,reqctx)

html表单是

    <form enctype="multipart/form-data" method="post" action="{% url uploaded %}"> {% csrf_token %}
    <input type="file" name="fselect" id="fselect">    </input>
    <input type="submit" id="uploadbtn" value="upload">    
    </form>

现在我想用一些javascript来调用django视图。我已经编写了上传视图的 ajax 版本

def ajax_upload_file(request):
    to_return = {}
    store_message="failure"
    if request.method == 'POST':
        if request.FILES.has_key('fselect'):
            file = request.FILES['fselect']
            with open('/uploadpath/%s' % file.name, 'wb+') as dest:
                for chunk in file.chunks():
                    dest.write(chunk)
            store_message="success"
     to_return['store_message']= store_message
     serialized = simplejson.dumps(to_return)
     if store_message == "failure":
        return HttpResponseServerError(serialized, mimetype="application/json")
     else:
        return HttpResponse(serialized, mimetype="application/json")

我对如何将file对象从javascript代码传递到 django 视图感到困惑。

javascript代码

$(document).ready(function(){
  $('#fselect').change(function(){uploadFile()});

}
function uploadSubTitleFile(){
    //check if it is a subtitle file?
    var file=document.getElementById('fselect').files[0];
    var data = {  };//how to pass the data
    var args = { type:"POST", url:"ajax_upload/", data:data, complete:done };    
    return;
}
4

1 回答 1

1

对于简单的答案,你没有。将您的表单发送到隐藏的 iframe 中,并让 javascript 调用其父窗口。

由于文件上传是通过 iframe 进行的,HTTP 状态码等传统响应数据无法直接获得,连接管理器无法合理判断成功或失败(事务超时除外)。相反,回调的上传处理程序将在事务完成时接收包含 iframe 文档正文的响应对象,作为字符串。

http://developer.yahoo.com/yui/connection/#upload

我的建议是,找一个体面的库来为你做这件事并使用它:

使用最近的浏览器,可以在不依赖 iframe 的情况下做到这一点:Sending multipart/formdata with jQuery.ajax

于 2012-05-17T15:44:42.760 回答