2

So I am trying to upload a file without any external plugins, but I am running into some errors.

                <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>

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

my server :

class ImageUploadView(LoginRequiredMixin, JSONResponseMixin, AjaxResponseMixin, CurrentUserIdMixin, View):

    @method_decorator(csrf_protect)
    def dispatch(self, *args, **kwargs):
        return super(ImageUploadView, self).dispatch(*args, **kwargs)

    def post_ajax(self, request, username):
                print request.POST.get('file', None)
                print request.FILES

        # id = request.POST['id']
        # path = 'pictures/'
        # f = request.FILES['picture']
        # destination = open(path, 'wb+')
        # for chunk in f.chunks():
        #   destination.write(chunk)
        # destination.close()
return HttpResponse("image uploaded")

I get a <MultiValueDict: {}> for the request.FILES

how do I properly get the uploaded file now with my code?

3

2 Answers 2

5

Here is what I use to upload files using javascript, hope this helps ! Just pass your $('#file') as a parameter.

function upload(field, upload_url) {
    if (field.files.length == 0) {
        return;
    }
    file = field.files[0];
    var formdata = new FormData();
    formdata.append('file_upload', file);
    $.ajax({
        url: upload_url,
        type: 'POST',
        data: formdata,
        processData: false,
        contentType: false,
        success: console.log('success!')
    });
}

[EDIT]

And this is what I do on the server side (simplified):

def save_file(dest_path, f, filename):
    original_name, file_extension = os.path.splitext(f.name)
    filename = filename + '-' + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + file_extension
    url = '/' + dest_path + '/' + filename
    path = django_settings.MEDIA_ROOT + url
    destination = open(path, 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()
    return path

class FileUploadView(View):
    def post(self, request, *args, **kwargs):
        if request.FILES and request.FILES.get('file_upload'):
            path = save_file(UPLOAD_TO, 
                             request.FILES.get('file_upload'), 
                             FILENAME)
        return self.render_to_response({})
Sign up to request clarification or add additional context in comments.

1 Comment

what about the server side?
3

i followed this tutorial http://www.script-tutorials.com/pure-html5-file-upload/ and in the php part i replaced with :

class UploadImageView(LoginRequiredMixin, CurrentUserIdMixin, View):

    @method_decorator(csrf_protect)
    def dispatch(self, *args, **kwargs):
        return super(UploadImageView, self).dispatch(*args, **kwargs)

    def post(self, request, username):
        path = 'myproject/media/pictures/guitar.jpg'
        f = request.FILES['image_file']
        destination = open(path, 'wb+')
        for chunk in f.chunks():
            destination.write(chunk)
            destination.close()

            return HttpResponse("image uploaded")

also changed this lines

<form id="upload_form" enctype="multipart/form-data" method="post" action=".">
                                {% csrf_token %}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.