服务器接收不到图片信息,flutter 上传图片 我是按照dio官方的代码写的 但是服务器接收不到...

博主分享了在使用Flutter上传图片到Java服务器时遇到的问题及解决方案。经过一天半的努力,他们找到了一个冷门的方法使得服务器能接收到图片。Flutter部分的代码涉及dio库的FormData使用,而Java后台通过Part获取文件并保存。博主承诺如果其他人需要类似代码,他们愿意提供帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flutter 上传图片 我是按照dio官方的代码写的 但是服务器接收不到,真是够够的~~~

我们两个用了很多种办法 测试 搞了一天半 终于搞出来了

老规矩 废话不多说 直接上代码

flutter 代码

上传代码

HttpHelper httpHelper = new HttpHelper();

httpHelper.controller = value.changeAvatarC;

httpHelper.action = value.changeAvatarA;

String path = imageFile.path;

var name = path.substring(path.lastIndexOf("/") + 1, path.length);

var suffix = name.substring(name.lastIndexOf(".") + 1, name.length);

FormData formData = FormData.from({

"username":widget.model.username,

"file":new UploadFileInfo(new File(path), name,contentType: ContentType.parse("image/$suffix")),

});

httpHelper.post(data: formData).then((m){

func();

if(m == 3){

Fluttertoast.showToast(msg: "修改成功");

Navigator.pop(context);

}

});

httphelper 里面的post代码

/*

* post请求

*/

Future post({data, Options options, cancelToken}) async {

Response response;

if(data == null){

data = new FormData();

}

String url = builder();

data[value.login_token] = await Tool().getString(value.token);

print("post url =====================$url params =============== $data");

print("options ===================== $options");

try {

response = await dio.post(url, data: data, options: options, cancelToken: cancelToken);

print('post success---------${response.data}');

} on DioError catch (e) {

print('post error---------$e');

formatError(e);

return null;

}

return response.data;

}

java代码(我的后台是java)

Part part = request.getPart("file");

String fileNames = getFileName(part);

String path = writeTo(fileNames,part,nowDate);

private String getFileName(Part part) {

String head = part.getHeader("Content-Disposition");

String fileName = head.substring(head.indexOf("filename=\"")+10, head.lastIndexOf("\""));

System.out.println(fileName);

return fileName;

}

private String writeTo(String fileName, Part part,String nowDate)throws IOException {

String addAndFilename = "/"+"upload" + "/" + nowDate + "/";

filesPath=filesPath.replace("file:","");

String finalPath = filesPath + addAndFilename;

if (!new File(finalPath).exists() || !new File(finalPath).isDirectory()) {

new File(finalPath).mkdirs();

}

InputStream in = part.getInputStream();

OutputStream out = new FileOutputStream(finalPath+fileName);

byte[] b = new byte[1024];

int length = -1;

while((length = in.read(b))!=-1){

out.write(b, 0, length);

}

in.close();

out.close();

return finalPath+fileName;

}

他告诉我这是个非常冷门的东西 基本上很少用 如果大胸弟们需要其他的代码 评论区找我 我知无不言言无不尽

### 如何在 Flutter 中使用 Dio上传文件 在 Flutter 开发中,`dio` 是一个功能强大的 HTTP 客户端库,支持多种复杂的网络操作场景。为了实现文件上传的功能,可以利用 `FormData` 来构建请求体并发送 POST 请求。 以下是具体实现方法: #### 使用 Dio 单例管理全局配置 推荐将 Dio 实例作为单例来管理整个应用中的网络请求配置[^1]。通过这种方式,可以在初始化时集中设置基础 URL、超时时间以及通用头部信息等参数。 ```dart import 'package:dio/dio.dart'; final dio = Dio(BaseOptions( baseUrl: "https://example.com/api/", // 设置基础URL connectTimeout: Duration(seconds: 5), // 连接超时时间 receiveTimeout: Duration(seconds: 30), // 接收数据超时时间 )); ``` #### 文件上传的核心逻辑 当需要上传文件时,可以通过创建 `MultipartFile` 对象并将它加入到 `FormData` 中完成这一过程。下面是一个完整的示例代码片段展示如何执行此操作: ```dart Future<void> uploadFile(String filePath, String fileName) async { try { File file = File(filePath); // 创建本地文件对象 FormData formData = FormData.fromMap({ "file": await MultipartFile.fromFile(file.path, filename: fileName), "name": "example", // 可选附加字段 }); Response response = await dio.post("/upload_endpoint", data: formData); if (response.statusCode == 200 || response.statusCode == 201) { print("Upload successful!"); } else { throw Exception('Failed to upload file'); } } catch (e) { print(e.toString()); } } ``` 在此段代码里: - 需要导入 Dart 的核心库 `dart:io` 才能处理文件 I/O 操作。 - 调用了 `await MultipartFile.fromFile()` 方法读取指定路径下的文件内容,并将其转换成适合传输的形式。 - 将准备好的表单数据传递给 dio 的 post 方法提交至服务器上的特定路由 `/upload_endpoint`. 注意:实际开发过程中应替换掉 `"https://example.com/api/"` 和 `"/upload_endpoint"` 成真实的服务地址与接口名称。 #### 错误处理机制 考虑到网络状况可能不稳定或者服务端出现问题,在调用 API 前最好加上异常捕获语句以便及时反馈错误消息给用户。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值