Ошибка декодирования при загрузке файла с внешнего интерфейса Flutter на серверную часть Django - PullRequest
0 голосов
/ 06 октября 2019

Я хотел бы загрузить изображение из внешнего интерфейса флаттера на сервер python (django).

Я пытался отлаживать это дольше, чем хотелось бы признать. В сети нет ресурсов, показывающих, как обрабатывать загрузку файла из Flutter в бэкэнд Django.

Бэкэнд получает файл, но я получаю ошибку декодирования UTF-8, когда файл сохраняется влокальное хранилище.

Это конкретная ошибка, которую я получаю, когда пытаюсь загрузить изображение:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte.

Я включил полный обратный поиск в this pastebin .

Информация о файле в том виде, в каком она получена серверной частью:

{'file': <_io.BytesIO object at 0x7fe121a44f50>,
 '_name': 'tempProfilePic.jpg',
 'size': 311489, 
 'content_type': 'application/octet-stream',
 'charset': None,
 'content_type_extra': {},
 'field_name': 'file'}

Ниже приведен код моего внешнего интерфейса:

if (_imageFile != null) {
  var stream =
      http.ByteStream(DelegatingStream.typed(_imageFile.openRead()));
  var length = await _imageFile.length();
  var multipartFile = http.MultipartFile('file', stream, length,
      filename: basename(_imageFile.path));
  request.files.add(multipartFile);
}
request.fields['token'] = token
var response = await request.send();

_imageFileпеременная File, которая содержит изображение .png, сохраненное в хранилищеФайл отправляется без ошибок.

Ниже приведен мой внутренний код: models.py

class userData(models.Model):
    profilePic = models.FileField(upload_to='documents/')
    token = models.CharField()

И элемент представления, который обрабатывает запрос на публикацию: views.py

def uploadImage(request):
    currUser = userData.objects.get(token=request.data['token'])
    if request.FILES['file']:
        currUser.profilePic= request.FILES['file']

Если то, что я сейчас делаю, кажется слишком сложным для отладки, есть ли более простые способы, чтобы я мог подойти к этому? (например, отправка файла в виде строки из внешнего интерфейса?)

(К вашему сведению, мне нужен бэкэнд для других функций и я не могу использовать подходы без обслуживания или с использованием firebase. Все остальные функции выполняются в Django. последние вещи, которые у меня остались).

Я могу предоставить любую дополнительную информацию, если это необходимо.

Спасибо за вашу помощь.


Есть несколько вопросовупоминая ошибку декодирования UTF-8, ни одна из которых не является исчерпывающей или содержит достаточно кода, чтобы я мог отладить мой вариант использования. И они, кажется, не используют модели Django. Я занимался этим несколько дней и попробовал несколько из них, но не смог реализовать ни один из них. Поддвиг в правильном направлении был бы оценен.

1 Ответ

0 голосов
/ 07 октября 2019

Это позорно глупо, но правильный ответ - открыть файл перед его загрузкой:

currUser.profilePic= request.FILES['file'].open()

...