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

使用Amazon S3 TransferManager上传临时文件时文件名截断问题求助

问题解决方案

一、修复现有临时文件上传的文件名截断问题

文件名截断的核心原因大概率是上传S3时未明确指定完整的对象Key,或临时文件的实际命名逻辑存在隐式修改。按以下步骤修复:

  1. 确保临时文件命名完全可控
    避免依赖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);
    }
    
  2. 上传时明确指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:46:30