Flutter WEB отправляет файл на бэкенд Django Rest Framework
Итак, в моем фронт-энде (WEB). Я использую пакеты Image_picker и затем image_cropper для получения файла.
Я знаю, что flutter web не поддерживает Dart/io, поэтому вместо этого нужно отправить изображение в многокомпонентном запросе FromBYtes. Обычно для приложений ios/android flutter можно использовать fromFile. Теперь я отправляю изображение на бэкенд в виде байтов. Однако, мое представление на базе django rest framework не может сохранить изображение в мою модель.
вот код и шаг за шагом:
final imagetoSendToAPIasbytes = await cropImageFile.readAsBytes();
List<int> imageaslistint = imagetoSendToAPIasbytes.cast();
final response = await uploadImage(imageaslist, profileid);
функция загрузки изображения:
var profilepic = await http.MultipartFile.fromBytes(
"profilepic", imageaslistint);
request.files.add(profilepic);
http.StreamedResponse response = await request.send();
var responseByteArray = await response.stream.toBytes();
Конечно, это не полный код. Но я могу отправить его в back end. Мой django backend view для обработки:
@api_view(['PATCH', ])
@throttle_classes([updateprofileprofilepicThrottle])
@parser_classes((MultiPartParser, FormParser, JSONParser))
def updateprofileprofilepic(request,):
try:
user = request.user
except User.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
try:
if request.method == "PATCH":
profileobjid= json.loads(request.data['profileid'])
profileobj = Profile.objects.get(creator = user, id = profileobjid)
profileobj.profilepic.delete(False)
print(request.FILES['profilepic'])
print(json.loads(request.data['profilepic']))
profileobj.profilepic= json.loads(request.data['profilepic'])
profileobj.save()
обычно (request.FILES['profilepic'])
позволяет мне сохранить файл (с ios/android)
однако это происходит, когда запрос отправляется как многокомпонентный request.fromPATH.
Теперь (json.loads(request.data['profilepic']))
я могу получить байты, но как мне сохранить их в IMAGE на моей модели. Спасибо, любая помощь будет оценена по достоинству
'''<QueryDict: {'profileid': ['xxxx-xxx-xxx-xxxxxe-xxxxx'], 'profilepic': ['�PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01........'''
Итак, я разобрался. при выполнении этого вызова из Flutter WEB ВЫ ДОЛЖНЫ включить: var profilepic = await http.MultipartFile.fromBytes( "profilepic", file, filename: 'hello.png');
Имя файла. это необходимо для того, чтобы django restframework и multiformparser могли сохранить его как изображение.