我有一个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发送“文件”的哪种格式?还有其他可能有效的方法吗?预先谢谢你。
答案 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上找到有关它的更多信息。