2011-01-20 20 views
8

Basit bir AJAX dosya yüklemesi yapmak için ajax-upload kodunu kullanıyorum. Karşılaştığım sorun, dosya gönderildikten sonra arka sayfada görünmüyor. Alex Kuhl kodunu kullanarak Benim içinDjango ile Dosya Yüklemesi

def add_image(request, id): 
    print request 
    if request.FILES: 
     return HttpResponse("{success:true}") 
    else: 
     return HttpResponse("{success:false, message:'Unable to find FILES}") 

cevap

12

, request.GET['qqfile'] dosya adı vardı:

<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> 

(şu anda devam) arka uç kodu da oldukça basit:

önyüzü kodu oldukça basit ve request.read() (Django 1.3'te) verileri döndürdü.

request.FILES yalnızca benim için henüz yaşanmamış bir senaryoda kullanıldı. Ben Photologue doğrudan konuşmak ajax-yükleme kullanıyorum ve benim kod şöyle görünür: Benim durumumda

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, filename, is_raw) 

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

, ajax_upload

+0

IMAGE_UPLOAD_PATH öğesini nerede tanımlayabilirim? –

+0

Bu sabit gerekmiyor, Thunder sadece mutlak bir yol oluşturmak için kullanıyor. Yüklemelerin sabit yerine kaydedilmesini istediğiniz dizinin sabit kodlanmış bir değerini kullanabilirsiniz. Yine de kullanmak istiyorsanız, settings.py dosyanıza yerleştirdiğiniz bir şey olur ve kullanmak için görünümü içe aktarın. Ayrıca nod Thunder için teşekkürler, başkaları benim yazı yararlı buldular. –

+0

@alex: Tamam, 'request.META [' PWD '] + "/ appName/static/images /" + dosyaadı "kullanıyorum. –

1

Andrew Valums şimdi var Ajax'ın action: parametresi tarafından çağrılan işlevdir django app git hub adresinde