从Flutter前端上传文件到Django后端时发生解码错误

时间:2019-10-06 09:08:59

标签: python django flutter dart dart-http

我想将图像从flutter前端上传到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()

以及处理发布请求的view元素: 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 :(得分:0)

这真是可笑,但正确的答案是在上传文件之前先打开文件:

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