Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload files in Odoo web form

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)

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

Code above creates attachment, with name res_model etc., but attached file iss damaged and can't 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 console this:

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')>
like image 813
Misters Avatar asked Aug 09 '15 17:08

Misters


1 Answers

i think problem is with base64.encode(file.read())

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

so, try to use in this way and check
attachment = file.read()
then
'datas' : attachment.encode('base64')

like image 99
shravan cherukuri Avatar answered Nov 02 '22 13:11

shravan cherukuri