2015-08-09 16 views
5

Ho un modulo Web personalizzato in odoo. Ho bisogno di caricare file. La mia controllers.py:Carica file nel modulo web 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) 

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

codice precedente crea attaccamento, con il nome res_model ecc, ma iss file allegato danneggiato e non può essere aperto.

di file 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> 

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

rendimenti:

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

Prova: enctype = "multipart/form-data" A: "enctype =" application/octet-stream" – dsgdfg

+0

Questo non funziona. Windows non mostra il tipo di errore nel file di registro, ma la pagina continua a caricarsi e basta. – Misters

+0

quando un file non è stato aperto su python. Hai errori EOF o header. Il caricamento di richiede un'intestazione di contenuto corretta. Hai un oggetto base64 ma non ho idea della tua procedura di salvataggio. – dsgdfg

risposta

0

Questo è come funziona :

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

e poi:

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

Questo aggiunge file in allegato

+0

Questo non funziona. Non c'è nessun oggetto con un nome "post". – user568021

1

penso che problema è con base64.encode (file.read())

f rom python docs abbiamo
base64.encode (input, output) ¶
Codifica il contenuto del file di input e scrive i dati codificati base64 risultanti nel file di output. input e output devono essere oggetti file o oggetti che imitano l'interfaccia dell'oggetto file. l'input verrà letto finché input.read() non restituisce una stringa vuota. encode() restituisce i dati codificati più un carattere di fine riga finale ('\ n').

Quindi, cercare di utilizzare in questo modo e controllare
attachment = file.read()
poi
'dati': attachment.encode ('base64')

+0

attachment = file.read() Non restituisce nulla, quindi immagino che il problema ci sia. – Misters