使用Amazon S3 TransferManager上传临时文件时文件名截断问题求助
问题解决方案
一、修复现有临时文件上传的文件名截断问题
文件名截断的核心原因大概率是上传S3时未明确指定完整的对象Key,或临时文件的实际命名逻辑存在隐式修改。按以下步骤修复:
确保临时文件命名完全可控
避免依赖File.createTempFile的自动命名逻辑,直接在系统临时目录创建指定名称的文件:// 生成完整的目标文件名 String s3FileName = UUID.randomUUID().toString() + ".pdf"; // 在系统临时目录创建文件 File tempFile = new File(System.getProperty("java.io.tmpdir"), s3FileName); // 将MultipartFile内容写入临时文件 try (InputStream inputStream = multipartFile.getInputStream(); FileOutputStream outputStream = new FileOutputStream(tempFile)) { // 用Spring工具类或Apache Commons IO完成流拷贝 org.springframework.util.FileCopyUtils.copy(inputStream, outputStream); } catch (IOException e) { throw new RuntimeException("Failed to write temp file", e); }上传时明确指定S3对象Key
上传时直接使用预先定义的s3FileName作为S3的对象键,不要依赖tempFile.getName()(避免临时文件系统的隐式修改):PutObjectRequest putRequest = new PutObjectRequest("your-bucket-name", s3FileName, tempFile); s3Client.putObject(putRequest); // 上传完成后立即删除临时文件,避免堆积 if (!tempFile.delete()) { // 若删除失败,标记为JVM退出时自动删除 tempFile.deleteOnExit(); }
二、TransferManager直接上传方案(无需临时文件)
如果不想依赖临时文件,TransferManager支持直接通过InputStream上传,同时可自由指定S3文件名,完全避免本地文件堆积:
// 初始化TransferManager(推荐单例注入,避免重复创建) TransferManager transferManager = TransferManagerBuilder.standard() .withS3Client(s3Client) .build(); for (MultipartFile file : multipartFiles) { // 自定义S3上的文件名 String s3Key = UUID.randomUUID().toString() + ".pdf"; // 设置文件元数据(可选,如内容类型、长度) ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(file.getSize()); metadata.setContentType(file.getContentType()); // 发起上传请求 Upload upload = transferManager.upload( "your-bucket-name", s3Key, file.getInputStream(), metadata ); // 等待上传完成(异步场景可省略,根据业务需求处理回调) try { upload.waitForCompletion(); } catch (InterruptedException | AmazonClientException e) { throw new RuntimeException("Upload to S3 failed", e); } } // 关闭TransferManager(单例模式下无需每次调用) transferManager.shutdownNow();
内容的提问来源于stack exchange,提问作者tabool
相关产品推荐
相关产品推荐

