Kotlin 如何使用Chopper发送文件?

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(),

在我的kotlin项目中,我使用了
改造
,效果很好

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
注释支持三种数据类型:

  • 列表
  • 字符串
    (文件路径)
  • MultipartFile
    (来自包:http)
您当前正在使用
字符串
,但由于未知原因,该字符串不适用于您。第一个选项可能是最简单的,但第三个选项将是最类似于您目前在改装,所以我们可以尝试

导入“包: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