存储在django中通过浏览器动态生成的多个文件

时间:2014-08-06 16:53:38

标签: django django-models django-forms django-views recorder.js

我在我的django应用程序中使用RecorderJS。在此,在浏览器中创建多个音频文件。我的问题是如何将这些文件存储在服务器中(直接从浏览器中)。

我在upload_to中使用FileField(可以通过表单存储)或在Django中使用file-based sessions等方面很少使用。但是,我不知道如何继续进行,因为结合以下原因似乎很复杂:

  • 多个文件 同时存储
  • 直接从浏览器存储(不在浏览器中手动上传)。

有没有人能解决这个问题。提前谢谢。

[更新] 我已经按照代码的形式进行了如下所示的指示:

urls.py

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

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)

我通过Ajax Jquery发送音频文件(blob)。

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); }

});

然后我在Django视图[views.py]中收到此文件。但是,虽然收到了文件,但在调用save()方法时会生成错误。有没有人知道这方面的解决方案还是有更好的方法:

@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 个答案:

答案 0 :(得分:0)

出于安全原因,浏览器不允许您设置<file>表单字段的值。 (想象一下隐藏这个字段并将值设置为一些易受攻击的文件)。

您需要post the file via JavaScript