2016-09-12 5 views
0

Я не могу загружать изображения на сервер. Все атрибуты есть до изображений. В request.FILES они есть, но только как unicode массив имени файла. И эта ошибка:Django + Ajax + FormData: загруженный файл представляет собой unicode-массив

AttributeError: 'unicode' object has no attribute 'read' 

Это мое мнение:

for _f in request.FILES: 
     print(_f) 
     for _fi in _f: 
      print(_fi) 
     photo = PostPhoto.objects.create(photo = _f, name = str(_f)) 
     photo.save() 

     destination = open('media/photos/'+str(photo.pk)+'.jpeg', 'w') 
     for chunk in _f.read(): 
      destination.write(chunk) 
     destination.close() 

     print(photo) 

     post.photos = photo 

и это ЯШИ:

    if (file.length <= 10) { 
         if (hasExtension(file, ['jpeg','jpg'])) { 
          console.log('files are correct'); 
          var message = document.getElementById('search_textarea').value; 
          console.log('text'); 
          var body_data = new FormData(); 
          body_data.append('text', message); 
          body_data.append('loc_lat', elements[i].latitude); 
          body_data.append('loc_lon', elements[i].longitude); 
          body_data.append('loc_name', results[i].name); 
          body_data.append('loc_addr', results[i].formatted_address); 
          body_data.append('types', results[i].types); 
          body_data.append('action', null); 
          for(var k = 0; k <= (file.length - 1); k++) { 
           console.log(file[k]); 
           body_data.append(k, file[k], file[k].name); 
          } 
          this.$.ajaxNewPost.body = body_data; 
          this.$.ajaxNewPost.contentType = false; 
          this.$.ajaxNewPost.generateRequest(); 
          console.log('ajax sended'); 
         } else { 
          console.log('incorrect files'); 
         } 
        } else { 
         alert('too match files'); 
        } 

Как я могу решить это? Я попытался разместить его через tastypie, но я не мог сохранить изображение тоже, из-за tastypie вернулся для меня байт-файл этого запроса

ОБНОВЛЕНО КОД:

for _f in request.FILES: 
     photo = PostPhoto.objects.create(photo=_f, name=str(_f)) 
     photo.save() 

     destination = open('media/photos/' + str(photo.pk) + '.jpeg', 'w') 
     for _file in request.FILES.get(_f): 
      for chunk in _file: 
       destination.write(chunk) 

     post.photos = photo 
     destination.close() 

ответ

1

в коде for _f in request.FILES: _f - тип юникода, что означает, что это просто строка.

пытаются использовать _f = request.FILES.get('your_parameter_name') заменить его

+0

да, это работает, я уже обновил свой вопрос, может быть, вы можете улучшить свой код, потому что 4.5MB изображение понадобилось около 300 мс, чтобы сохранить –

+0

я думаю, что это может привести к по вашей сети. но сервер работает в localhost? – mymusise

+0

Да, я думаю, это может быть связано с сохранением файла во временную папку. Мой ноутбук слишком медленный для этого –