2015-08-09 2 views
5

У меня есть пользовательская веб-форма в odoo. Мне нужно загрузить файлы. Мой controllers.py:Загрузить файлы в веб-форме Odoo

@http.route(['/test/'], type='http', auth="user", methods=['GET', 'POST'], website=True) 
def upload_files(self, **post): 
    values = {} 
    form_vals = {} 

       ........... 

    if post.get('attachment',False): 
     Attachments = request.registry['ir.attachment'] 
     name = post.get('attachment').filename  
     file = post.get('attachment') 
     attachment_id = Attachments.create(request.cr, request.uid, { 
      'name':name, 
      'res_name': name, 
      'type': 'binary', 
      'res_model': 'project.issue', 
      'res_id': form_id, 
      'datas': base64.encode(file.read()), 
     }, request.context) 

      ............ 

Код выше создает вложение, с именем res_model и т.д., но прикрепленный файл ISS поврежден и не может быть открыт.

XML файл:

.......... 

<form t-attf-action="/test/done" method="post" enctype="multipart/form-data" class="form-horizontal mt32"><div t-attf-class="form-group"> 

    .......... 

    <div t-attf-class="form-group"> 
     <label class="col-md-3 col-sm-4 control-label" for="attachment">Attachments</label> 
     <div class="col-md-7 col-sm-8"> 
      <input name="attachment" type="file" class="file" multiple="true" data-show-upload="true" data-show-caption="true" lass="file" data-show-preview="true"/> 
     </div> 
    </div>> 

    .......... 
</form> 

В консоли это:

name = post.get('attachments_for_issue').filename 
_logger.error("name is: %r", name) 
file = post.get('attachments_for_issue') 
_logger.error("file is?: %r", file.read()) 

возвращается:

5092 ERROR HDHDHD openerp.addons.test.controllers.controllers: name is: u'test_image.jpg' 
5092 ERROR HDHDHD openerp.addons.test.controllers.controllers: file is?: <FileStorage: u'test_image.jpg' ('image/jpeg')> 
+0

Try: ENCTYPE = "многочастные/форм-данных" To: "ENCTYPE =" приложение/октет-поток» – dsgdfg

+0

Это не работает. Windows не показывает, какая ошибка в файле журнала, но страница продолжает загружаться, и все. – Misters

+0

, когда файл не открыт на python. Вы получили EOF или ошибку заголовка. загрузить требуемый заголовок содержимого. У вас есть объект base64, но я не знаю о вашей процедуре сохранения. – dsgdfg

ответ

0

Вот как это работает :

file = post.get('attachment') 
attach = file.stream 
f = attach.getvalue() 

, а затем:

... 
'datas': base64.encodestring(f), 
... 

Это добавляет файл в приложении

+0

Это не работает. Нет объекта с именем «post». – user568021

1

я думаю, что проблема с base64.encode (file.read())

f rom python docs у нас есть
base64.encode (input, output) ¶
Кодировать содержимое входного файла и записывать полученные в результате данные, закодированные в base64, в выходной файл. вход и выход должны быть либо файловыми объектами, либо объектами, имитирующими интерфейс файлового объекта. ввод будет считан до тех пор, пока input.read() не вернет пустую строку. encode() возвращает закодированные данные плюс конечный символ новой строки ('\ n').

так, попробуйте использовать таким образом, и проверить
вложения = file.read()
затем
'Данные': attachment.encode ('base64')

+0

attachment = file.read() Не возвращает ничего, поэтому я думаю, проблема там. – Misters