如何使用 Chopper 发送文件?
How to send file using Chopper?
在我的 kotlin 项目中,我使用 retrofit
并且效果很好。
suspend fun createPlan(
context: Context?,
name: String,
file: File?
): ABC? {
val fileSignImage = file?.let {
MultipartBody.Part.createFormData(
"image",
it.getName(),
RequestBody.create("image/*".toMediaTypeOrNull(), it)
)
}
return RetrofitFactory.apiCall(context) {
RetrofitFactory.makeRetrofitService().createPlan(
name.toRequestBody("text/plain".toMediaTypeOrNull()),
fileSignImage
)
}}
RetrofitService
@Multipart
@POST("create_plan")
fun createPlan(
@Part("name") name: RequestBody,
@Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>
如果我想使用Chopper
,正确的方法是什么?
这是我试过的
Future<Response> createPlan(
BuildContext context, String name,String path) async {
Response response;
try {
response = await _service.createPlan(
name,path);
return response;
} catch (e) {
rethrow;
}
}
服务
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);
如何将 imagePath 转换为文件,以便使用 Chopper
将其作为文件传递给服务器?
有人吗?
查看 Chopper 的文档,PartFile
注释支持三种数据类型:
List<int>
String
(path of your file)
MultipartFile
(from package:http)
您目前正在使用 String
,但由于未知原因它不适合您。第一个选项可能是最直接的,但第三个选项与您目前在 Retrofit 中的选项最相似,因此我们可以尝试一下。
import 'package:http/http.dart';
...
Future<Response> createPlan(BuildContext context, String name, String path) async {
Response response;
try {
final bytes = (await File(path).readAsBytes()).toList();
final file = MultipartFile.fromBytes('image', bytes);
response = await _service.createPlan(
name,
file,
);
return response;
} catch (e) {
rethrow;
}
}
服务
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,
@PartFile('image') MultipartFile image,
);
我设法使用 http 而不是 Chopper
上传文件。
Future<http.Response> createPlan(String name, String path) async {
var request = http.MultipartRequest(
"POST",
Uri.parse(
"http://xxx"));
request.fields['name'] = name;
request.files.add(await http.MultipartFile.fromPath(
'image',
path,
));
try {
var streamedResponse = await request.send();
var response = http.Response.fromStream(streamedResponse);
return response;
} catch (e) {
rethrow;
}
}
在我的 kotlin 项目中,我使用 retrofit
并且效果很好。
suspend fun createPlan(
context: Context?,
name: String,
file: File?
): ABC? {
val fileSignImage = file?.let {
MultipartBody.Part.createFormData(
"image",
it.getName(),
RequestBody.create("image/*".toMediaTypeOrNull(), it)
)
}
return RetrofitFactory.apiCall(context) {
RetrofitFactory.makeRetrofitService().createPlan(
name.toRequestBody("text/plain".toMediaTypeOrNull()),
fileSignImage
)
}}
RetrofitService
@Multipart
@POST("create_plan")
fun createPlan(
@Part("name") name: RequestBody,
@Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>
如果我想使用Chopper
,正确的方法是什么?
这是我试过的
Future<Response> createPlan(
BuildContext context, String name,String path) async {
Response response;
try {
response = await _service.createPlan(
name,path);
return response;
} catch (e) {
rethrow;
}
}
服务
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);
如何将 imagePath 转换为文件,以便使用 Chopper
将其作为文件传递给服务器?
有人吗?
查看 Chopper 的文档,PartFile
注释支持三种数据类型:
List<int>
String
(path of your file)MultipartFile
(from package:http)
您目前正在使用 String
,但由于未知原因它不适合您。第一个选项可能是最直接的,但第三个选项与您目前在 Retrofit 中的选项最相似,因此我们可以尝试一下。
import 'package:http/http.dart';
...
Future<Response> createPlan(BuildContext context, String name, String path) async {
Response response;
try {
final bytes = (await File(path).readAsBytes()).toList();
final file = MultipartFile.fromBytes('image', bytes);
response = await _service.createPlan(
name,
file,
);
return response;
} catch (e) {
rethrow;
}
}
服务
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,
@PartFile('image') MultipartFile image,
);
我设法使用 http 而不是 Chopper
上传文件。
Future<http.Response> createPlan(String name, String path) async {
var request = http.MultipartRequest(
"POST",
Uri.parse(
"http://xxx"));
request.fields['name'] = name;
request.files.add(await http.MultipartFile.fromPath(
'image',
path,
));
try {
var streamedResponse = await request.send();
var response = http.Response.fromStream(streamedResponse);
return response;
} catch (e) {
rethrow;
}
}