2016-02-06 6 views
2

Я пытаюсь заставить пользователя загружать файл изображения, а затем он должен автоматически преобразовываться в строку base64.Django не смог рассмотреть изображение

Так что мой вход форма выглядит,

<form role="form" method="POST" action="{% url 'Guideform-edit' object.pk %}" 
       class="post-form form-horizontal">{% csrf_token %} 
      <!-- customizing form --> 
      {{ form|crispy }} 
      <!-- End of customization --> 
      <div style="position:relative;"> 
       <a class='btn btn-primary' href='javascript:;'> 
        Choose File... 
        <input type="file" 
          style='position:absolute;z-index:2;top:0;left:0;bottom:0;right:0;filter: alpha(opacity=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;background-color:transparent;color:transparent;' 
          name="file_source" size="40" onchange='$("#upload-file-info").html($(this).val());'> 
       </a> 
       &nbsp; 
       <span class='label label-info' id="upload-file-info"></span> 
      </div> 
      <button type="submit" class="save btn btn-default btn-primary center-block">Update</button> 

     </form> 

Соответствующий класс вид похож,

class GuideFormUpdateView(UpdateView): 
    model = Guide 
    fields = ['name', 'image', 'point_of_interest'] 
    template_name_suffix = '_update_form' 

    def post(self, request, *args, **kwargs): 
     query_dict = request.POST 
     img = Image.open(StringIO(query_dict['file_source'])) 
     print img 

И ошибка я получил, это,

File "/home/avinash/django_projects/guide/src/guide/views.py" in post 
    166.   img = Image.open(StringIO(query_dict['file_source'])) 

File "/home/avinash/.virtualenvs/guide/local/lib/python2.7/site-packages/PIL/Image.py" in open 
    2295.     % (filename if filename else fp)) 

Exception Type: IOError at /guides/edit/1 
Exception Value: cannot identify image file <StringIO.StringIO instance at 0x7f427ab4c6c8> 

Я также пытался печати переменная query_dict,

print query_dict 

Выход меня есть

{u'csrfmiddlewaretoken': u'xxxxxxxxxxx', u'name': u'pieza tower', u'file_source': u'20150706_104718.jpg'} 

Таким образом, кажется, что он получает загруженное изображение в виде строки, а не в качестве фактического изображения.

+0

StringIO используется точно так же, как файл, который сохраняется на диск, но из строки. PIL (библиотека изображений Python) не может идентифицировать файл как изображение. –

ответ

3

Несколько вещей здесь:

  1. Вы должны указать enctype="multipart/form-data" атрибут формы для загрузки файлов

  2. Файл хранится в request.FILES, не request.POST

И, наконец, , чтобы фактически конвертировать в base64, вы можете использовать модуль

encoded_img = base64.b64encode(filehandler.read()) 

где filehandler является обработчиком к файлу в request.FILES

Кроме того, похоже, что вы не имеете input type='file' загружены с помощью формы Джанго. Возможно, было бы лучше, если бы форма django обрабатывала проверки, чтобы вы не столкнулись с проблемами безопасности и т. Д. (Вы можете ограничить типы входных файлов и т. Д.),

+0

отлично ..... Спасибо Karthik .. И по некоторым причинам я не хочу, чтобы файл импортировался через форму django. –

Смежные вопросы