Storing multiple files generated dynamically over browser in django

288 views Asked by At

I am using RecorderJS in my django application. In this, multiple audio files are created in the browser. My question is how can I store these files in the server (directly from the browser).

I have got few leads like using upload_to in FileField (which can be stored via forms) or using file-based sessions in Django. However, I am not sure how to proceed as it seems complicated for me to combine the following reasons:

  • multiple files to be stored simulataneously,
  • and storing directly from browser (not manually uploading in the browser).

Does anyone have solution to this. Thanks in advance.

[Update] I have proceeded the direction as shown below in the form of a code:

In urls.py

url(r'^audio_file/$', 'nalign_app_recorder.views.recorder'),

In models.py

class InputFile(models.Model):

audio_file = models.FileField(upload_to='/audio')
input_user = models.ForeignKey(User)
rec_date = models.DateTimeField('date recorded', auto_now_add=True)

I am sending the audio file (blob) via Ajax Jquery.

function uploadBlob(blob) {
var fd = new FormData();
fd.append('fname', 'test.wav');
fd.append('data', blob);
$.ajax({
type: 'POST',
url: '/audio_file/',
data: fd,
processData: false,
contentType: false,

success: function(response) {
console.log("everything worked!");
$("#audio_file").html(response);
},
error: function(obj, status, err) { alert(err); console.log(err); }

});

Then I receive this file in the Django view [views.py]. However, though the file is received but the error is generated when the save() method is invoked. Does anyone know the solution for this or is there any better method:

@csrf_exempt    
def recorder(request):
if request.method=='POST' or request.is_ajax():

    e1=InputFile() 
    e1.audio_file=request.FILES  #<-- Audio file is received here
    e1.input_user=request.user
    e1.rec_date=datetime.datetime.now()
    e1.save()   #<-- When save() method is executed, **error** is generated
   return HttpResponseRedirect(--another-page--)
return render_to_response('recorder2.html',RequestContext(request))
1

There are 1 answers

2
Krzysztof Szularz On

Due to security reasons browsers don't allow you to set value of <file> form field. (Imagine hiding this field and setting the value to some vulnerable file).

You need to post the file via JavaScript.