You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:01:06