Кодирование и декодирование изображений. Base64 String Image - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь сохранить изображение, снятое с камеры, на сервер. Первый снимок будет преобразован в строку 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 не тот, который я хочу.

1 Ответ

0 голосов
/ 28 февраля 2020

Решил эту проблему. Проблема была с ImageField. Я изменил свою функцию django на следующее:

def fileAdd(request):
    pak = request.POST['IMG']
    tim = request.POST['tm']
    pak = pak.encode('utf-8')
    decoded_image_data = base64.decodebytes(pak)
    with open("C:\\Users\\Attique  Bhutta\\Desktop\\alauddin\\smartVisit\\DsmartVisit\\assets\\media\\" +tim+'.JPEG', 'wb') as file_to_save:
        file_to_save.write(decoded_image_data)
    path = "C:\\Users\\Attique  Bhutta\\Desktop\\alauddin\\smartVisit\\DsmartVisit\\assets\\media\\" +tim+'.JPEG';
    b = Task(imgPath=path)
    b.save()
    return HttpResponse("Added Successfully")
...