如何使用http包实现Flutter图片上传到Golang服务端及后续处理
Flutter端实现(使用官方http包)
依赖配置
首先在pubspec.yaml中添加http依赖:
dependencies: http: ^1.1.0
上传代码实现
import 'dart:io'; import 'package:http/http.dart' as http; Future<void> uploadImage(String localImagePath) async { // 构造POST类型的Multipart请求,替换为你的Golang服务接口地址 final request = http.MultipartRequest( 'POST', Uri.parse('http://你的服务IP:8080/upload'), ); // 将本地图片文件加入请求体,表单字段名需和Golang端对应,这里为upload_image request.files.add( await http.MultipartFile.fromPath('upload_image', localImagePath), ); // 可选:添加额外业务参数 request.fields['file_type'] = 'avatar'; request.fields['user_id'] = 'xxx'; // 发送请求,可按需添加超时配置 final response = await request.send().timeout(const Duration(seconds: 30)); // 处理响应结果 if (response.statusCode == 200) { final respStr = await response.stream.bytesToString(); print('上传成功:$respStr'); } else { print('上传失败,状态码:${response.statusCode}'); } }
调用时直接传入你拿到的本地图片路径即可。
Golang服务端实现
基础文件接收接口
使用Go标准库即可实现文件接收、校验、存储能力,示例代码如下:
package main import ( "io" "net/http" "os" "path/filepath" "strings" ) func uploadHandler(w http.ResponseWriter, r *http.Request) { // 限制单文件最大为10MB,可按需调整 err := r.ParseMultipartForm(10 << 20) if err != nil { http.Error(w, "文件超出大小限制", http.StatusBadRequest) return } // 读取表单中的上传文件,字段名和Flutter端保持一致 file, fileHeader, err := r.FormFile("upload_image") if err != nil { http.Error(w, "读取上传文件失败:"+err.Error(), http.StatusBadRequest) return } defer file.Close() // ------------- 图片校验逻辑 ------------- // 1. 校验文件后缀 fileExt := strings.ToLower(filepath.Ext(fileHeader.Filename)) allowExt := map[string]bool{".png": true, ".jpg": true, ".jpeg": true, ".webp": true} if !allowExt[fileExt] { http.Error(w, "不支持的文件格式", http.StatusBadRequest) return } // 2. 可选:校验文件魔数,避免后缀伪造 // 3. 可选:校验图片宽高是否符合业务要求 // ------------- 存储逻辑 ------------- // 测试用:存储到本地磁盘,先创建存储目录 _ = os.MkdirAll("./upload", 0755) savePath := filepath.Join("./upload", fileHeader.Filename) dstFile, err := os.Create(savePath) if err != nil { http.Error(w, "创建存储文件失败", http.StatusInternalServerError) return } defer dstFile.Close() _, err = io.Copy(dstFile, file) if err != nil { http.Error(w, "保存文件失败", http.StatusInternalServerError) return } // 后续对接S3时无需存本地,直接把file字节流传给S3 SDK的上传接口即可 // 示例伪代码:s3Client.Upload(context.TODO(), &s3.UploadInput{ // Bucket: aws.String("你的存储桶名"), // Key: aws.String("image/xxx"+fileExt), // Body: file, // }) w.Write([]byte("上传成功,存储路径:" + savePath)) } func main() { http.HandleFunc("/upload", uploadHandler) _ = http.ListenAndServe(":8080", nil) }
图片管理常用处理能力
可根据业务需求扩展以下能力:
- 自动生成唯一文件名:使用UUID+文件后缀的方式命名,避免重名覆盖
- 缩略图生成:使用Go标准库
image、image/jpeg等包对图片进行缩放,适配不同业务场景 - 格式统一转换:可将PNG、WebP等格式统一转为JPG,降低存储和传输成本
- EXIF信息读取:提取图片拍摄时间、地理位置、设备信息等元数据,用于图片分类和标签生成
- 合规校验:对接内容审核接口,检测图片是否包含违规内容
内容的提问来源于stack exchange,提问作者Choi yun seok
相关产品推荐
相关产品推荐

