2009年1月8日木曜日

Ajax file upload

byteflowのデコレータから引用していたけど、FileUploadに対応させました。

Ajaxでは
request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
が成り立つのですが、FileUploadはiframeを使いますのでつきません。
iframeでsubmitした場合、application/jsonにすると、ダウンロードが始まってしまうため、逃げます。
  1. def ajax_request(func):  
  2.     def wrapper(request, *args, **kw):  
  3.         if request.method == 'POST':  
  4.             response = func(request, *args, **kw)  
  5.         else:  
  6.             response = {'error': {'type'403,  
  7.                 'message':'Accepts only POST request'}}  
  8.         if isinstance(response, dict):  
  9.             if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':  
  10.                 class JsonResponse(HttpResponse):  
  11.                     def __init__(self, data):  
  12.                         super(JsonResponse, self).__init__(  
  13.                                 content=simplejson.dumps(data),  
  14.                                 mimetype='application/json')  
  15.                 return JsonResponse(response)  
  16.             else:  
  17.                 # for file upload  
  18.                 class IframeResponse(HttpResponse):  
  19.                     def __init__(self, data):  
  20.                         super(IframeResponse, self).__init__(  
  21.                                 content='<textarea>%s</textarea>'%simplejson.dumps(data))  
  22.                 return IframeResponse(response)  
  23.         else:  
  24.             return response  
  25.     return wraps(func)(wrapper)  


jquery.form.jsを使うと、具合が大変よろしいです。
  1. $('#image_form').ajaxForm({  
  2.     dataType: 'json',  
  3.     beforeSubmit: function() {if (!$('#icon').val()) return false},  
  4.     success: function(data) { render(data) },  
  5.     resetForm: true  
  6. })  

dataTypeは'json'で。
beforeSubmitの第1引数のformDataはnameで引けないので不便。
第2引数のjqFormで、jqForm[0].icon.valueでもOK。
もっといい指定方法は知りたい。
clearFormがなぜか効かなかったのでresetForm。

jquery.blockUI.jsで画像選択やアップロード画面を出すときれい。

jquery.js必須

0 件のコメント: