MultipartFile 接收,儲存至檔案系統/雲端存儲,回傳 JSON 結果。OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "photo.jpg",
RequestBody.create(MediaType.parse("image/jpeg"), imageBytes))
.addFormDataPart("userId", "12345")
.build();
Request request = new Request.Builder()
.url("https://api.example.com/upload")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() { ... });
var request = URLRequest(url: URL(string: "https://api.example.com/upload")!)
request.httpMethod = "POST"
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var body = Data()
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"photo.jpg\"\r\n".data(using: .utf8)!)
body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
body.append(imageData)
body.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
URLSession.shared.uploadTask(with: request, from: body).resume()
@Bean
public MultipartResolver multipartResolver() {
StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
return resolver;
}
// 或 application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
@PostMapping("/upload")
@ResponseBody
public Result uploadImage(
@RequestParam("file") MultipartFile file,
@RequestParam("userId") Long userId) {
// 1. 校驗
if (file.isEmpty()) return Result.error("檔案為空");
if (!Arrays.asList("image/jpeg", "image/png").contains(file.getContentType()))
return Result.error("僅支援 JPG/PNG");
// 2. 產生唯一檔名
String ext = FilenameUtils.getExtension(file.getOriginalFilename());
String fileName = UUID.randomUUID() + "." + ext;
String saveDir = "/data/uploads/" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
// 3. 儲存
File dir = new File(saveDir);
if (!dir.exists()) dir.mkdirs();
File dest = new File(dir, fileName);
try {
file.transferTo(dest);
} catch (IOException e) {
log.error("儲存失敗", e);
return Result.error("伺服器錯誤");
}
// 4. 回傳可存取 URL
String accessUrl = "https://cdn.example.com/uploads/" + fileName;
return Result.success(accessUrl);
}
max-file-size 設定;或未設定 enctype="multipart/form-data" (表單上傳時)。URIEncoding="UTF-8";Spring Boot 設定 server.tomcat.uri-encoding=UTF-8。file-size-threshold。完整範例專案:SpringMVC 文件上傳實戰
手機上傳圖片的標準協定是 HTTP POST + multipart/form-data。SpringMVC 透過 MultipartFile 抽象化處理,搭配雲端存儲 (S3/OSS) 與 CDN,即可構建高可用、高擴展的圖片上傳服務。