如何实现向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
相关产品推荐
相关产品推荐

