Я пытаюсь сохранить изображение, снятое с камеры, на сервер. Первый снимок будет преобразован в строку base 64, а затем отправлен в Django бэкэнд с помощью запроса залпа. На стороне django я использую base64.decodebytes(String Name)
, чтобы снова преобразовать его в изображение. Изображение преобразуется и сохраняется, но оно не возвращает ответ об успешном выполнении, и файл не сохраняется в каталоге, который я хочу.
Я использую поле изображения для сохранения изображения по заданному пути, используя
pic= models.ImageField(upload_to="Folder_name")
Android:
Функция для преобразования изображения в строку base64.
public String getStringImage(Bitmap bm){
ByteArrayOutputStream ba= new ByteArrayOutputStream( );
bm.compress( Bitmap.CompressFormat.JPEG,100,ba );
byte[] imagebyte = ba.toByteArray();
String encode = Base64.encodeToString(imagebyte, Base64.DEFAULT );
// Toast.makeText( MainActivity.this,"String is"+encode,Toast.LENGTH_LONG ).show();
return encode;
}
Использование Volley для отправки параметров на Django:
protected Map<String, String> getParams() throws AuthFailureError {
String image = getStringImage( photo );
Map<String , String> params = new HashMap<String, String>( );
Date date = new Date( );
long timeMilli = date.getTime();
params.put("IMG", image);
params.put("tm", String.valueOf( timeMilli ));
return params;
Pycharm
URL:
path('add_file', views.fileAdd, name='fil'),
Function DEf:
def fileAdd(request):
pak = request.POST['IMG']
tim = request.POST['tm']
pak = pak.encode('utf-8')
decoded_image_data = base64.decodebytes(pak)
with open(tim+'.JPEG', 'wb') as file_to_save:
file_to_save.write(decoded_image_data)
b = Task(pic=decoded_image_data)
if b.save():
return HttpResponse("Added Successfully")
else:
return HttpResponse("Not Added")
Ошибка:
Internal Server Error: /ams/add_file
Traceback (most recent call last):
File "C:\python38\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\python38\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\python38\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Attique Bhutta\Desktop\alauddin\smartVisit\DsmartVisit\ams\views.py", line 135, in fileAdd
if b.save():
File "C:\python38\lib\site-packages\django\db\models\base.py", line 745, in save
self.save_base(using=using, force_insert=force_insert,
File "C:\python38\lib\site-packages\django\db\models\base.py", line 782, in save_base
updated = self._save_table(
File "C:\python38\lib\site-packages\django\db\models\base.py", line 887, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:\python38\lib\site-packages\django\db\models\base.py", line 924, in _do_insert
return manager._insert(
File "C:\python38\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\python38\lib\site-packages\django\db\models\query.py", line 1204, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1383, in execute_sql
for sql, params in self.as_sql():
File "C:\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1326, in as_sql
value_rows = [
File "C:\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1327, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1327, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\python38\lib\site-packages\django\db\models\sql\compiler.py", line 1278, in pre_save_val
return field.pre_save(obj, add=True)
File "C:\python38\lib\site-packages\django\db\models\fields\files.py", line 286, in pre_save
if file and not file._committed:
AttributeError: 'bytes' object has no attribute '_committed'
[28/Feb/2020 11:09:01] "POST /ams/add_file HTTP/1.1" 500 178390
Изображение доставляется и сохраняется на стороне сервера. Но на сервере также выдает вышеупомянутую ошибку. И возвращенный ответ функции Python не тот, который я хочу.