使用 file_picker flutter 将图像上传到 nodejs 服务器
uploading image using file_picker flutter to a nodejs server
我有一个 api,它给出以下数据作为响应:
{
"status": 200,
"msg": "Data Found",
"data": {
"id": 104,
"firstName": "aaa",
"lastName": "aaa",
"surname": "aaa",
"email": "email@email.care",
"phone": "090909090",
"age": "23",
"gender": "M",
"height": "163",
"bloodGroup": null,
"weight": "72",
"status": null,
"fileId": 228,
"password": "pass",
"file": {
"id": 228,
"filename": "images.jpg",
"path": "user/images1613558976577.jpg",
"alt": "shafa care"
}
},
"success": true,
"token": "some token",
"userAccess": "some data"
}
响应中的“文件”参数用于保存用户上传的图片。对于我的更新方法,用户需要将他们的令牌作为 header 传递给更新 api。为了更新文件参数,我尝试了许多不同的方法来更新用户图像。下面的代码使用多部分表单数据来更新现有文件图像。
Future<AuthModel> updateImage(File imageFile, AuthModel authModel) async{
final String _accessToken = '${authModel.token}';
final String url =
'${GlobalConfiguration().getString('api_base_url')}auth/user/update';
var stream = new http.ByteStream(imageFile.openRead());
var length = await imageFile.length();
var uri = Uri.parse(url);
var request = new http.MultipartRequest("POST", uri);
request.headers['Authorization'] = _accessToken;
// request.headers['Content-Type'] = 'multipart/form-data';
var multipartFile = new http.MultipartFile('file', stream, length, filename: basename(imageFile.path));
request.files.add(multipartFile);
var response = await request.send();
print("updating: " + response.statusCode.toString());
response.stream.transform(utf8.decoder).listen((event) {
currentUser = authModelFromJson(event);
print("updating img: " + event);
});
return currentUser;
}
即使找到数据,上述函数也不会更新我的文件参数。我只是得到同样的旧回应。 filepicker 还会发送用户从图库中选择的正确图像路径。我也尝试使用 http.client.post 方法,使用令牌作为 header 和 'file' 参数作为 body 但随后找不到数据,因为 api 只接受form-data 上传图片时。
它在 postman 中使用 form-data post 方法工作。
我是 flutter 的新手,还在学习中。我被困在这里好几天了,没有任何解决办法。如何从我的 flutter 应用程序更新文件参数?感谢任何帮助。
这是示例代码。希望对您有所帮助!
static Future<bool> uploadFileAsFormData(
String url, File file) async {
try {
var uri = Uri.parse(_buildUrl(url));
var request = http.MultipartRequest('POST', uri);
request.files.add(await http.MultipartFile.fromPath('file', file.path));
var res = await request.send();
if (res.statusCode == 200) {
return true;
} else {
return false;
}
} catch (err) {
return false;
}
}
您可以使用此Dio上传图片,如下所示code
:
Dio dio = Dio();
var formData = FormData();
for (var file in filePath) {
formData.files.addAll([MapEntry("files", await MultipartFile.fromFile(file)),]);
print(formData.length);
}
var response = await dio.post(url
data: formData,
options: Options(headers: {
'Authorization': _accessToken
}));
if(response.statusCode == 200){
print(response.data.toString();
}
我有一个 api,它给出以下数据作为响应:
{
"status": 200,
"msg": "Data Found",
"data": {
"id": 104,
"firstName": "aaa",
"lastName": "aaa",
"surname": "aaa",
"email": "email@email.care",
"phone": "090909090",
"age": "23",
"gender": "M",
"height": "163",
"bloodGroup": null,
"weight": "72",
"status": null,
"fileId": 228,
"password": "pass",
"file": {
"id": 228,
"filename": "images.jpg",
"path": "user/images1613558976577.jpg",
"alt": "shafa care"
}
},
"success": true,
"token": "some token",
"userAccess": "some data"
}
响应中的“文件”参数用于保存用户上传的图片。对于我的更新方法,用户需要将他们的令牌作为 header 传递给更新 api。为了更新文件参数,我尝试了许多不同的方法来更新用户图像。下面的代码使用多部分表单数据来更新现有文件图像。
Future<AuthModel> updateImage(File imageFile, AuthModel authModel) async{
final String _accessToken = '${authModel.token}';
final String url =
'${GlobalConfiguration().getString('api_base_url')}auth/user/update';
var stream = new http.ByteStream(imageFile.openRead());
var length = await imageFile.length();
var uri = Uri.parse(url);
var request = new http.MultipartRequest("POST", uri);
request.headers['Authorization'] = _accessToken;
// request.headers['Content-Type'] = 'multipart/form-data';
var multipartFile = new http.MultipartFile('file', stream, length, filename: basename(imageFile.path));
request.files.add(multipartFile);
var response = await request.send();
print("updating: " + response.statusCode.toString());
response.stream.transform(utf8.decoder).listen((event) {
currentUser = authModelFromJson(event);
print("updating img: " + event);
});
return currentUser;
}
即使找到数据,上述函数也不会更新我的文件参数。我只是得到同样的旧回应。 filepicker 还会发送用户从图库中选择的正确图像路径。我也尝试使用 http.client.post 方法,使用令牌作为 header 和 'file' 参数作为 body 但随后找不到数据,因为 api 只接受form-data 上传图片时。
它在 postman 中使用 form-data post 方法工作。
我是 flutter 的新手,还在学习中。我被困在这里好几天了,没有任何解决办法。如何从我的 flutter 应用程序更新文件参数?感谢任何帮助。
这是示例代码。希望对您有所帮助!
static Future<bool> uploadFileAsFormData(
String url, File file) async {
try {
var uri = Uri.parse(_buildUrl(url));
var request = http.MultipartRequest('POST', uri);
request.files.add(await http.MultipartFile.fromPath('file', file.path));
var res = await request.send();
if (res.statusCode == 200) {
return true;
} else {
return false;
}
} catch (err) {
return false;
}
}
您可以使用此Dio上传图片,如下所示code
:
Dio dio = Dio();
var formData = FormData();
for (var file in filePath) {
formData.files.addAll([MapEntry("files", await MultipartFile.fromFile(file)),]);
print(formData.length);
}
var response = await dio.post(url
data: formData,
options: Options(headers: {
'Authorization': _accessToken
}));
if(response.statusCode == 200){
print(response.data.toString();
}