Flutter使用文件作为正文将发布请求发送到Django API

时间:2020-09-19 16:21:28

标签: django file flutter dart http-post

我有一个Django API,用户可以通过以下内容通过发布请求上传文件:

{
  "file": *attached file*
}

在Django中,该文件是使用request.FILES['file']

从请求中收集的

该请求必须从flutter(飞镖)代码发送。我尝试了几种方法,这是我最近一次尝试的函数,它显示错误-因为“文件”的格式不正确。

static void uploadProfilePhoto(File file, String fileId) async {
    Uint8List fileBytes = file.readAsBytesSync();
    var response = http.post(
      globals.baseURL() + "/upload/",
      //headers: {"Content-Type": "application/json"},
      body: {
        "file":base64Encode(fileBytes)
      }
    ).then((v)=>print("v: "+v.body));
  }

任何想法都应该从flutter发送“文件”的哪种格式?还有其他可能有效的方法吗?预先谢谢你。

2 个答案:

答案 0 :(得分:2)

在扑打中使用

import 'dart:convert' as convert;
import 'dart:io';
import 'package:http/http.dart' as http;

  @override
  Future<Map<String, dynamic>> sendFiletodjango(
      {File file,
    }) async {
    var endPoint = url;
    Map data = {};
    String base64file = base64Encode(file.readAsBytesSync());
    String fileName = file.path.split("/").last;
    data['name']=fileName;
    data['file']= base64file;
    try {
      var response = await http.post(endPoint,headers: yourRequestHeaders, body:convert.json.encode(data));
    } catch (e) {
      throw (e.toString());
    }
  }

在python django中使用

from django.core.files.base import ContentFile



file = response.data.get("file")
name = response.data.get("name")

your_file = ContentFile(base64.b64decode(file),name)

model.fileField = your_file
model.save()

答案 1 :(得分:0)

您可以尝试multipart/form-data使用HTTP post请求将文件从Flutter上传到Django服务器。

在颤动中,您可以按照以下所示的方式发送multipart/form-data请求。

Future<Response> uploadFile(File file) async {
  Response response;
  var uri = Uri.parse(url);
  var request = http.MultipartRequest('POST', uri);
  request.files.add(await http.MultipartFile.fromPath('file', file.path));
  var response = await request.send();
  if (response.statusCode == 200 || response.statusCode == 201) {
    print('Uploaded!');
  }
  return response;
}

您可以在Dart MultipartRequest上找到有关它的更多信息。