5

我的 django 项目中的文件上传有问题。所以问题是:如何通过 jquery ajax 将文件传递给 django 视图?

这一刻我有

脚本:

<script type='text/javascript'>
$(document).ready(function() {
    var csrf_token = $('input[name="csrfmiddlewaretoken"]').val();
    $('#upload').click(function() {
        $.ajax({
            csrfmiddlewaretoken: csrf_token,
            type: 'POST',
            url : '../ajax/upload_file/',
            enctype: "multipart/form-data",
            data  : {
                'file': $('#file').val()
            },
            success: function(data) {
                console.log(data)
            }
        })
    })
})
</script>

模板:

 <form method="" action="" name='upload_form' id='upload_form' >{% csrf_token %}
    <input type='file' name='file' id='file' />
    <input type='button' value='Upload' id='upload'/>
 </form>

查看:

@csrf_exempt
@xhr_to_json
def verifyFile(request):
    if request.is_ajax():
        file = request.FILES['file']
        return {'message': file}
    else: 
        return HttpResponseForbidden()

现在我得到

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111,      in get_response
response = callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
    return view_func(*args, **kwargs)
 File "/home/vova/git/LV-  083_LAMP.git/Testcase_Project/Testcase_Project/views/decorator.py", line 6, in wrapper
   data = func(*args, **kwargs)
  File "/home/vova/git/LV-   083_LAMP.git/Testcase_Project/Testcase_Project/views/testcase.py", line 96, in verifyFile
    request.FILES['file']
  File "/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py", line     258, in __getitem__
    raise MultiValueDictKeyError("Key %r not found in %r" % (key, self))
MultiValueDictKeyError: "Key 'file' not found in <MultiValueDict: {}>"

没有外部库可以做到吗?

4

3 回答 3

7

试试这个:

def upload(request):
  id = request.POST['id']
  path = '/var/www/pictures/%s' % id
  f = request.FILES['picture']
  destination = open(path, 'wb+')
  for chunk in f.chunks():
    destination.write(chunk)
  destination.close()
  # return status to client
  ...

你可以在这里阅读完整的教程:http: //www.laurentluce.com/posts/upload-to-django-with-progress-bar-using-ajax-and-jquery/

于 2013-04-04T12:55:47.503 回答
1
@csrf_exempt
@xhr_to_json
def verifyFile(request):
    if request.is_ajax():
        file = request.FILES['file']
        return HttpResponse(file)
    else: 
        return HttpResponseForbidden()

<form method="POST" action="" name='upload_form' id='upload_form' enctype="multipart/form-data">
    {% csrf_token %}
    <input type='file' name='file' id='file' />
    <input type='button' value='Upload' id='upload'/>
</form>
于 2013-04-04T13:07:23.620 回答
0

//html

<form  id = "form_id"   method = "POST" action = "#" enctype="multipart/form-data"> {% csrf_token %}
                        {{modelform_filefield}}
                        <input type = "submit" value="Post"/>
                    </form>

//javascript代码

<script>
    $(function(){
    $("#form_id").submit(function(){
    var data = new FormData($('#form_id').get(0));
                $.ajax({
                    type:"POST",
                    url: "your_upload_url",
                    data : data,
                    cache: false,
                    contentType: false,
                    processData: false,
                    success: function(data){
    alert('success');
                    },
                    failure: function(){
                        $(this).addClass("error");
                    }
                });
                return false;
    });
    });
</script>

这将从客户端提取文件和表单数据。URL 链接到处理和存储文件的视图。

//views.py

def upload(request):
    if request.is_ajax():
        form = <modelFormName>(request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponse("form saved")
        else:
            return HttpResponse("form invalid")

    return HttpResponse("not a ajax request")

这应该可以解决问题

于 2015-03-15T17:24:41.147 回答