If you want to upload a binary image to Odoo using API..here are the steps:
controllers/main.py
# -*- coding: utf-8 -*-
from odoo.tools.translate import _
from odoo import http
from odoo.http import request
from odoo.addons import web
from time import strftime
import functools
import datetime
import json
import base64
import sys
import copy
from dateutil import parser
import logging
from operator import itemgetter
logger = logging.getLogger(__name__)
def serialize_exception(f):
@functools.wraps(f)
def wrap(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception, e:
logger.debug("An exception occured during an http request")
#se = _serialize_exception(e)
error = {
'code': 200,
'message': "Odoo Server Error",
'data': str(e)
}
return json.dumps(error)
return wrap
class Binary(web.controllers.main.Binary):
@http.route('/api/upload_images', type='http', auth="public", csrf=False)
@serialize_exception
def upload_attachment(self, uid, ufile, ufile_name):
user_model = request.env['res.users']
user_ids = user_model.sudo().browse([('id', '=', uid)])
if user_ids:
user_obj = user_ids[0]
try:
user_obj.write({
'uploaded_files': base64.encodestring(ufile.read()),
'uploaded_files_filename': ufile_name,
})
except Exception:
args = {'status': 0, 'error': "Something horrible happened."}
return json.dumps(args)
return json.dumps({'status': 1, 'message': 'File uploaded successfully'})
else:
return json.dumps({'status': 0, 'message': 'User does not exist.'})
Where fields are:
uploaded_files = fields.Binary(string=_('Files'), attachment=True, store=True)
uploaded_files_filename = fields.Char("Filename")
and JS code is:
<script>
// grab your file object from a file input
// Where fileInput is
// <input id="fileInput" type="file" />
$('#fileInput').change(function () {
sendFile(this.files[0]);
});
function sendFile(file) {
var querydata = new FormData();
querydata.append('ufile',file);
querydata.append('ufile_name',file.name);
querydata.append('uid', 10);
//querydata.append('multi', 'true');
$.ajax({
url: "http://xxxxx:8069/api/upload_images",
data: querydata,
type: "POST",
cache: false,
processData: false,
contentType: false,
dataType: "json",
beforeSend: function (xhr) {
},
success: function (result) {
console.log(result);
console.log(result.status);
},
error: function (err) {
console.log(err);
}
});
}
</script>
References:
https://www.odoo.com/forum/help-1/question/openerp-multiple-file-upload-54736
https://code.tutsplus.com/tutorials/base64-encoding-and-decoding-using-python--cms-25588
https://www.odoo.com/forum/help-1/question/change-filename-on-field-binary-52235
Thanks!!!!!!!!!! Enjoy Programming!!! :)
controllers/main.py
# -*- coding: utf-8 -*-
from odoo.tools.translate import _
from odoo import http
from odoo.http import request
from odoo.addons import web
from time import strftime
import functools
import datetime
import json
import base64
import sys
import copy
from dateutil import parser
import logging
from operator import itemgetter
logger = logging.getLogger(__name__)
def serialize_exception(f):
@functools.wraps(f)
def wrap(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception, e:
logger.debug("An exception occured during an http request")
#se = _serialize_exception(e)
error = {
'code': 200,
'message': "Odoo Server Error",
'data': str(e)
}
return json.dumps(error)
return wrap
class Binary(web.controllers.main.Binary):
@http.route('/api/upload_images', type='http', auth="public", csrf=False)
@serialize_exception
def upload_attachment(self, uid, ufile, ufile_name):
user_model = request.env['res.users']
user_ids = user_model.sudo().browse([('id', '=', uid)])
if user_ids:
user_obj = user_ids[0]
try:
user_obj.write({
'uploaded_files': base64.encodestring(ufile.read()),
'uploaded_files_filename': ufile_name,
})
except Exception:
args = {'status': 0, 'error': "Something horrible happened."}
return json.dumps(args)
return json.dumps({'status': 1, 'message': 'File uploaded successfully'})
else:
return json.dumps({'status': 0, 'message': 'User does not exist.'})
Where fields are:
uploaded_files = fields.Binary(string=_('Files'), attachment=True, store=True)
uploaded_files_filename = fields.Char("Filename")
and JS code is:
<script>
// grab your file object from a file input
// Where fileInput is
// <input id="fileInput" type="file" />
$('#fileInput').change(function () {
sendFile(this.files[0]);
});
function sendFile(file) {
var querydata = new FormData();
querydata.append('ufile',file);
querydata.append('ufile_name',file.name);
querydata.append('uid', 10);
//querydata.append('multi', 'true');
$.ajax({
url: "http://xxxxx:8069/api/upload_images",
data: querydata,
type: "POST",
cache: false,
processData: false,
contentType: false,
dataType: "json",
beforeSend: function (xhr) {
},
success: function (result) {
console.log(result);
console.log(result.status);
},
error: function (err) {
console.log(err);
}
});
}
</script>
References:
https://www.odoo.com/forum/help-1/question/openerp-multiple-file-upload-54736
https://code.tutsplus.com/tutorials/base64-encoding-and-decoding-using-python--cms-25588
https://www.odoo.com/forum/help-1/question/change-filename-on-field-binary-52235
Thanks!!!!!!!!!! Enjoy Programming!!! :)
Thanks, I willl try it right now
ReplyDeletebase64 image uploading possible or not
ReplyDeletePlease do some research first.
Delete