加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax – 使用Django的FileUpload

发布时间:2020-12-16 03:12:18 所属栏目:百科 来源:网络整理
导读:我正在使用 ajax-upload代码进行简单的AJAX文件上传.我遇到的问题是提交后文件没有显示在后端. 前端代码非常基本: div id="image_uploader"Upload More Images/divscript type="text/javascript" charset="utf-8" function createUploader(){ var uploader
我正在使用 ajax-upload代码进行简单的AJAX文件上传.我遇到的问题是提交后文件没有显示在后端.

前端代码非常基本:

<div id="image_uploader">Upload More Images</div>
<script type="text/javascript" charset="utf-8">
    function createUploader(){            
        var uploader = new qq.FileUploader({
            element: document.getElementById('image_uploader'),action: '/add/image/1',debug: true,onSubmit : function () {
                progress.show();
            },onComplete : function () {
                progress.hide();
            },onCancel : function () {
                progress.hide();
            },});           
    };

    createUploader();
</script>

后端代码(当前正在进行中)也非常基本:

def add_image(request,id):
    print request
    if request.FILES:
        return HttpResponse("{success:true}")
    else:
        return HttpResponse("{success:false,message:'Unable to find FILES}")
对我来说,使用 Alex Kuhl中的代码,request.GET [‘qqfile’]具有文件名,request.read()(在Django 1.3中)返回数据.

request.FILES仅用于尚未发生的情况.我正在使用ajax-upload直接与Photologue对话,我的代码看起来像这样:

def save_upload( uploaded,filename,raw_data ):
    """
    raw_data: if True,upfile is a HttpRequest object with raw post data
    as the file,rather than a Django UploadedFile from request.FILES
    """
    try:
        filename = os.path.normpath(os.path.join(IMAGE_UPLOAD_PATH,filename))
        with BufferedWriter( FileIO( filename,"wb" ) ) as dest:
            # if the "advanced" upload,read directly from the HTTP request
            # with the Django 1.3 functionality
            if raw_data:
                (dirName,fileName) = os.path.split(filename)
                (fileBaseName,fileExtension)=os.path.splitext(fileName)
                #
                # right here,if fileBaseName is less than n characters,might want to slap on a date just for fun
                #
                try:
                    i_can_has_p = Photo.objects.get(title=fileBaseName)
                    title = fileBaseName + "_" + str(datetime.datetime.now().strftime("%Y%m%dT%H%M%S"))
                except Photo.DoesNotExist:
                    title = fileBaseName
                title_slug = slugify(title)
                p = Photo(title=title,title_slug=title_slug)
                p.image.save(filename,ContentFile(uploaded.read()))
            # if not raw,it was a form upload so read in the normal Django chunks fashion
            else:
                # TODO: figure out when this gets called,make it work to save into a Photo like above
                for c in uploaded.chunks( ):
                    dest.write( c )
    except IOError:
        # could not open the file most likely
        return False
    return True

def ajax_upload( request ):
  if request.method == "POST":
      # AJAX Upload will pass the filename in the querystring if it is the "advanced" ajax upload
      if request.is_ajax( ):
          # the file is stored raw in the request
          upload = request
          is_raw = True
          try:
              filename = request.GET[ 'qqfile' ]
          except KeyError:
              return HttpResponseBadRequest( "AJAX request not valid" )
      # not an ajax upload,so it was the "basic" iframe version with submission via form
      else:
          is_raw = False
          if len( request.FILES ) == 1:
              # FILES is a dictionary in Django but Ajax Upload gives the uploaded file an
              # ID based on a random number,so it cannot be guessed here in the code.
              # Rather than editing Ajax Upload to pass the ID in the querystring,note that
              # each upload is a separate request so FILES should only have one entry.
              # Thus,we can just grab the first (and only) value in the dict.
              upload = request.FILES.values( )[ 0 ]
          else:
              raise Http404( "Bad Upload" )
          filename = upload.name

  # save the file
  success = save_upload( upload,is_raw )

  # let Ajax Upload know whether we saved it or not
  ret_json = { 'success': success,}
  return HttpResponse( json.dumps( ret_json ) )

在我的例子中,ajax_upload是ajax的action:参数调用的函数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读