Kotlin 如何使用Chopper发送文件?
在我的kotlin项目中,我使用了Kotlin 如何使用Chopper发送文件?,kotlin,flutter,dart,retrofit2,chopper,Kotlin,Flutter,Dart,Retrofit2,Chopper,在我的kotlin项目中,我使用了改造,效果很好 suspend fun createPlan( context: Context?, name: String, file: File? ): ABC? { val fileSignImage = file?.let { MultipartBody.Part.createFormData( "image", it.getName(),
改造
,效果很好
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
)
}}
改装服务
@Multipart
@POST("create_plan")
fun createPlan(
@Part("name") name: RequestBody,
@Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);
服务
@Multipart
@POST("create_plan")
fun createPlan(
@Part("name") name: RequestBody,
@Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);
@Post(路径:“创建计划”)
@多部分
未来计划(
@字段('name')字符串名称,@PartFile('image')字符串imagePath);
如何将imagePath转换为文件,以便使用Chopper
将其作为文件传递给服务器
有人吗?查看Chopper的文档,
PartFile
注释支持三种数据类型:
列表
(文件路径)字符串
(来自包:http)MultipartFile
字符串
,但由于未知原因,该字符串不适用于您。第一个选项可能是最简单的,但第三个选项将是最类似于您目前在改装,所以我们可以尝试
导入“包:http/http.dart”;
...
Future createPlan(BuildContext上下文、字符串名称、字符串路径)异步{
反应;
试一试{
final bytes=(等待文件(path).readAsBytes()).toList();
final file=MultipartFile.fromBytes('image',bytes);
响应=等待_service.createPlan(
名称
文件
);
返回响应;
}捕获(e){
改头换面;
}
}
服务
@Multipart
@POST("create_plan")
fun createPlan(
@Part("name") name: RequestBody,
@Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>
@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);
@Post(路径:“创建计划”)
@多部分
未来计划(
@字段('name')字符串名称,
@零件文件(“图像”)多零件文件图像,
);
我是通过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;
}
}
Future createPlan(字符串名称、字符串路径)异步{
var request=http.MultipartRequest(
“职位”,
Uri.parse(
"http://xxx"));
request.fields['name']=name;
request.files.add(等待http.MultipartFile.fromPath(
“图像”,
路径
));
试一试{
var streamdresponse=等待请求。发送();
var response=http.response.fromStream(streamdresponse);
返回响应;
}捕获(e){
改头换面;
}
}
您已经显示了代码片段,但没有提到问题所在,因此没有人可以回答。你试过运行那个代码吗?你有例外吗?请求是否未被发送?服务器是否未接收到请求?请求是否不包含您期望的内容?有什么问题吗?@Ovidiu我想把文件传给服务器而不是字符串。你的服务器是在接收字符串,还是你只是假设你在发送字符串?然而,在尝试运行代码片段时,您并没有描述问题所在(至少没有任何技术证明,例如异常或奇怪的请求体)。您正在使用一种受支持的数据类型:什么不起作用???@Ovidiu服务器端不应接受String
。在我的kotlin代码中,我实际上将MultipartBody.Part
传递给服务器,一切正常。但在弗利特,它失败了。我无法告诉您错误是什么,因为错误是从服务器端返回的。我猜是因为我将它作为字符串
传递,而不是多部分体.Part
?什么意思?因为它是由服务器返回的,所以无法判断错误是什么?在不指定错误的情况下,您希望任何人如何帮助您?没有为类“File”定义方法“readAsBytes”。请尝试将名称更正为现有方法的名称,或定义一个名为“readAsBytes”的方法。
@Hoo是否导入了dart:io
?好的,导入后我现在就知道了<代码>位置参数太多:应为0,但找到1。尝试删除额外的参数。
@Hoo啊,这些天我在C#和JS上花了太多时间,我一直忘了Dart的文件
方法不是静态的。请参见该行上的编辑。仍不起作用。服务器端希望使用MultipartBody.Part
而不是MultipartFile
。