2013-03-07 26 views
1

我正在寻找一种方法来实现客户端文件(图像)从jQuery上传到Django-Tastypie。Django-Tasypie图像上传与JQuery的例子

到目前为止,服务器端看来,卷曲正确测试:

我发现这个职位有帮助Django-tastypie: Any example on file upload in POST?

编辑:这是我做的,卷曲 - >

in api.py : 
    class MultipartResource(object): 
     def deserialize(self, request, data, format=None): 
      if not format: 
       format = request.META.get('CONTENT_TYPE', 'application/json') 
      if format == 'application/x-www-form-urlencoded': 
       return request.POST 
      if format.startswith('multipart'): 
       data = request.POST.copy() 
       data.update(request.FILES) 
       return data 
      return super(MultipartResource, self).deserialize(request, data, format) 


    class FooResource(MultipartResource, ModelResource): 
     img = fields.FileField(attribute="img", null=True, blank=True) 
     class Meta: 
      queryset = Foo.objects.all() 
      authorization= Authorization() 


in models.py : 
class Foo(models.Model): 
    img = models.ImageField(upload_to="images", null=True, blank=True) 
    body = models.CharField(max_length=255) 

然后运行以下命令与卷曲:

curl -v -F "body=test" -F "[email protected]_picture.png" http://localhost:8000/api/v1/foo/ 

现在我是试图做与jQuery一样的客户端,而不是卷曲.....没有运气。 这是很难找到的jQuery + Tastypie工作示例文件上传...

如果您有任何简单的例子分享

+0

告诉我们你的卷曲工作,你很高兴,我们可以告诉你如何做到这一点在jquery – 2013-03-07 05:45:40

+0

刚刚添加的样本,卷曲工作 – vsidou 2013-03-07 06:45:25

回答

0

可用感谢如果你的意思是使用$.ajax()$.post(),那么它不会因为工作Ajax不支持文件上传。见例如this SO post

虽然有一些解决方法 - 例如,通过隐藏的iframe或基于Flash的解决方案通过表单上传 - 他们在上面提到的SO帖子中讨论过。它们都不是完美的,所以你将不得不选择最适合你的用例。

+0

谢谢,我会测试的方法! – vsidou 2013-03-25 12:12:25

+0

当然,不客气!祝你好运! – kgr 2013-03-25 15:37:35

0

如果有人在将来遇到此问题,我使用this jquery File Upload Demo on github在我的案例中得到了图片上传的工作(已经在使用curl了)。

使用基本的文件上传:

  1. 包括必要的js文件(jQuery的,jQuery的文件上传, iframe的运输和jquery.ui.widget)。
  2. 初始化目标input[type=file]控制如下图所示

代码:

$('#fileupload').fileupload({ 
     url: url, 
     dataType: 'json', 
     done: function (e, data) { 
      $.each(data.result.files, function (index, file) { 
       $('<p/>').text(file.name).appendTo('#files'); 
      }); 
     }, 
     progressall: function (e, data) { 
      var progress = parseInt(data.loaded/data.total * 100, 10); 
      $('#progress .progress-bar').css(
       'width', 
       progress + '%' 
      ); 
     } 
    }).prop('disabled', !$.support.fileInput) 
     .parent().addClass($.support.fileInput ? undefined : 'disabled'); 

这应该做的伎俩。