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

如何实现向Spark API端点上传文件?附相关代码片段

完整Spark API文件上传端点实现

结合你给出的代码片段,我整理出了完整可运行的实现,补全了文件读取、保存的核心逻辑,并优化了配置细节:

import static spark.Spark.*;
import org.eclipse.jetty.servlet.MultipartConfigElement;
import javax.servlet.http.Part;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class SceneFileUploader {
    public static void main(String[] args) {
        // 配置CORS,允许跨域POST上传请求
        after((request, response) -> {
            response.header("Access-Control-Allow-Origin", "*");
            response.header("Access-Control-Allow-Methods", "POST");
            response.header("Access-Control-Allow-Headers", "Content-Type"); // 必须允许这个头,否则multipart请求会被拦截
        });

        // 初始化上传目录,确保目录存在(不存在则创建)
        Path uploadDir = Paths.get("./scene_uploads");
        if (!Files.exists(uploadDir)) {
            Files.createDirectories(uploadDir);
        }

        // 定义文件上传端点
        post("/scene", (request, response) -> {
            // 配置Jetty的Multipart处理,临时目录用系统默认临时目录更可靠
            String tempDir = System.getProperty("java.io.tmpdir");
            request.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement(tempDir));

            try {
                // 获取前端上传的文件部件(表单字段名要和前端一致:uploaded_file)
                Part filePart = request.raw().getPart("uploaded_file");
                String originalFileName = filePart.getSubmittedFileName();

                // 构造目标文件路径,避免文件名重复可以加时间戳或UUID,这里先用原始文件名示例
                Path targetFile = uploadDir.resolve(originalFileName);

                // 将上传文件的输入流复制到目标文件,覆盖已存在的同名文件
                try (InputStream inputStream = filePart.getInputStream()) {
                    Files.copy(inputStream, targetFile, StandardCopyOption.REPLACE_EXISTING);
                }

                // 返回成功响应
                response.status(200);
                return String.format("文件上传成功:%s,保存路径:%s", originalFileName, targetFile.toAbsolutePath());
            } catch (Exception e) {
                // 捕获并返回上传异常信息
                response.status(500);
                return String.format("文件上传失败:%s", e.getMessage());
            }
        });
    }
}

关键细节说明:

  • 依赖要求:Spark底层依赖Jetty处理Multipart请求,需要确保你的项目中包含Jetty Servlet依赖(Maven示例):
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>9.4.51.v20230217</version> <!-- 版本需与你的Spark依赖版本匹配 -->
    </dependency>
    
  • 权限与目录:uploadDir对应的目录必须有写入权限,否则会抛出IOException
  • 文件名处理:如果需要避免同名文件覆盖,可以给文件名添加时间戳或UUID前缀,比如:
    String uniqueFileName = System.currentTimeMillis() + "_" + originalFileName;
    Path targetFile = uploadDir.resolve(uniqueFileName);
    
  • 前端请求要求:前端必须以multipart/form-data格式发送请求,表单字段名必须为uploaded_file,示例HTML表单:
    <form action="http://localhost:4567/scene" method="post" enctype="multipart/form-data">
        <input type="file" name="uploaded_file">
        <button type="submit">上传</button>
    </form>
    

内容的提问来源于stack exchange,提问作者Xhark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:03:07