smilebomb
smilebomb

Reputation: 5483

Accessing temporary file from upload in django view

Just as the title says, I want to know how to access the data from the temporary file stored by Django, when a file is uploaded, inside a view.

I want to read the data uploaded values so I can make a progress bar. My methodology is to perform a jquery getJSON request:

function update_progress_info() {
        $progress.show();
        $.getJSON(progress_url, function(data, status){
            if (data) {
                var progress = parseInt(data.uploaded) / parseInt(data.length);
                var width = $progress.find('.progress-container').width()
                var progress_width = width * progress;
                $progress.find('.progress-bar').width(progress_width);
                $progress.find('.progress-info').text('uploading ' + parseInt(progress*100) + '%');
            }
            window.setTimeout(update_progress_info, freq);
        });
    };

where progress_url is the view I have that handles the uploaded file data:

# views.py (I don't know what to do here):
def upload_progress(request):
    for line in UploadedFile.temporary_file_path
        response = (line)
    return response

Upvotes: 2

Views: 6912

Answers (1)

Paulo Bu
Paulo Bu

Reputation: 29804

Django handles uploaded files with UploadHandler defined in settings.py with this name FILE_UPLOAD_HANDLERS that defaults to this tuple:

FILE_UPLOAD_HANDLERS = 
 ("django.core.files.uploadhandler.MemoryFileUploadHandler",
 "django.core.files.uploadhandler.TemporaryFileUploadHandler",)

The behavior with file uploads is that if the file is less than 2.5 mg then it will be kept on memory, hence, they will not be written in disk as temporary files.

If the file weights more, it will be written in chunks in the FILE_UPLOAD_TEMP_DIR in the settings.py. That's the file you'll have to query to know how many bytes have been uploaded.

You can access the uploaded/uploading files through your request variables in views like this: file = requests.FILES['file'] . There, file variable will have the type UploadedFile which contains a method temporary_file_path with the address of the file in the disk being uploaded. (Note: only files larger than 2.5 mg will have this methods) so there you may get the size of the file being uploaded.

Another way to do this is create your own UploadHandler like a ProgressBarUploadHandler and add it to your file upload handlers. This is the way the docs recommend it. Here are some snippets and tutorials for doing it.

If you need any more info the doc is really well documented.

I hope you find this helpful. Good luck.

Upvotes: 6

Related Questions