如何使用Play Framework(Java)向Akamai服务器上传文件
Java版Play Framework实现Akamai文件上传(解决412错误)
需求背景
将以下Scala语言的Play Framework向Akamai上传文件的代码,转换为Java版本;此前尝试HTTP multipart方式上传时返回412响应码,需修正实现。
Scala原实现代码
import akka.stream.scaladsl.FileIO import akka.stream.scaladsl.Source import play.api.libs.ws.WSClient import play.api.mvc.MultipartFormData._ val pathToFile = "./sampleCV.pdf" val fileName = "sampleCV.pdf" val futureResponse = ws.url(url).withRequestTimeout(Duration.create(55, TimeUnit.SECONDS)) .addHttpHeaders("authorization" -> s"bearer $access_token") .addHttpHeaders("accept" -> "*/*") .addHttpHeaders("content-type" -> "multipart/form-data") .post(Source( FilePart("File", fileName, Option("application/pdf"), FileIO.fromPath(Paths.get(pathToFile))) :: List() ))
Java正确实现代码
import akka.stream.javadsl.FileIO; import akka.stream.javadsl.Source; import play.libs.ws.WSClient; import play.mvc.Http.MultipartFormData; import java.nio.file.Paths; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; // WSClient可通过Play依赖注入获取 WSClient ws = ...; String akamaiUploadUrl = "你的Akamai上传地址"; String accessToken = "你的授权令牌"; String filePath = "./sampleCV.pdf"; String fileName = "sampleCV.pdf"; // 构建对应Akamai要求的FilePart MultipartFormData.FilePart<Source<akka.util.ByteString, ?>> filePart = MultipartFormData.FilePart .<Source<akka.util.ByteString, ?>>create( "File", // 表单字段名,必须与Scala版完全一致 fileName, // 上传文件名 "application/pdf", // 文件MIME类型 FileIO.fromPath(Paths.get(filePath)) // 文件流数据源 ); // 组装multipart请求体 Source<MultipartFormData.Part<Source<akka.util.ByteString, ?>>, ?> requestBody = Source.single(filePart); // 发送上传请求 CompletionStage<WSResponse> uploadFuture = ws.url(akamaiUploadUrl) .setRequestTimeout(55, TimeUnit.SECONDS) .addHttpHeader("authorization", "bearer " + accessToken) .addHttpHeader("accept", "*/*") // 关键:不要手动设置Content-Type,Play WS会自动生成带边界符的正确头 .post(requestBody); // 处理上传结果示例 uploadFuture.thenAccept(response -> { if (response.getStatus() == 200) { System.out.println("文件上传成功"); } else { System.err.println("上传失败,状态码:" + response.getStatus()); System.err.println("响应详情:" + response.getBody()); } });
412错误核心原因与注意事项
- 禁止手动设置
content-type: multipart/form-data:Play WS处理multipart请求时,会自动生成包含唯一边界符的Content-Type头(格式如multipart/form-data; boundary=xxxx),手动设置会丢失边界符,导致Akamai无法解析请求体,返回412预条件失败。 - 表单字段名严格匹配:FilePart的第一个参数
"File"必须与Scala版完全一致,Akamai对表单字段名有严格校验。 - 验证授权令牌:412也可能是令牌过期、权限不足或格式错误,需确认
accessToken有效且符合bearer {token}格式。 - 文件路径与权限:确保
filePath指向的文件存在,且应用进程有读取权限。 - 超时设置:大文件上传需设置足够长的超时时间,避免中途断开触发错误。
内容的提问来源于stack exchange,提问作者suv1sh
相关产品推荐
相关产品推荐

