Upload Odoo Web Form Files

I have a custom web form in odoo. I need to upload files. My controllers.py:

@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) ............ 

The code above creates an attachment named res_model, etc., but the attached file is damaged and cannot be opened.

XML file:

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

In the console:

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

returns:

 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')> 
+6
source share
3 answers

Here's how it works:

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

and then:

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

This adds the file to the application.

0
source

I think the problem is related to base64.encode (file.read ())

from python docs we have
base64.encode (input, output) ΒΆ
Encode the contents of the input file and write the received data encoded in base64 to the output file. input and output must be either file objects or objects that mimic the interface of a file object. input will be read until input.read () returns an empty string. encode () returns encoded data plus the trailing newline character ('\ n').

so try using it this way and check attachment = file.read ()
then
'datas': attachment.encode ('base64')

+1
source

If getvalue () does not work or gives the problems it gave me, you can also try:

 file = post.get('attachment').stream.read() 

then:

 'datas': base64.encodestring(file) 
0
source

All Articles