S3 Multi Part Upload 中断后续传

续传大文件至S3
本文介绍如何使用boto库实现大文件的分段上传至Amazon S3,并提供了中断后如何继续上传的方法。示例代码展示了如何初始化上传任务、分块发送文件以及完成上传流程。

我们上传大文件时难免出错,但又不愿意重新开始传,这里介绍如何利用boto,继续中断的 multi part upload。

上传大文件示例

import math, os
import boto
import boto.s3.connection
from filechunkio import FileChunkIO

CONS_AK = 'RC35MU8KM1PMEQ4EFD46'
CONS_SK = 'Fg1KO10FS4uIPzSoKenmKAR2YHt052rM9u8VDik9'

# Connect to S3
c = boto.connect_s3(
            aws_access_key_id=CONS_AK,
            aws_secret_access_key=CONS_SK,
            host='yhg-2',
            port=80,
            is_secure=False,
            calling_format=boto.s3.connection.OrdinaryCallingFormat()
        )

# b = c.get_bucket('mybucket')
b = c.create_bucket('mybucket')

# Local file path
source_path = './local-50M-file'
source_size = os.stat(source_path).st_size

# Create a multipart upload request
mul_key = 'HEHE'
header = {
    'x-amz-meta-gang': 'Yang Honggang'
}
# Record upload id
# upload_id = mp.id
mp = b.initiate_multipart_upload(mul_key, headers=header)

# Use a chunk size of 20 MiB (feel free to change this)
chunk_size = 20971520
chunk_count = int(math.ceil(source_size / float(chunk_size)))

# Send the file parts, using FileChunkIO to create a file-like object
# that points to a certain byte range within the original file. We
# set bytes to never exceed the original file size.
for i in range(chunk_count):
    offset = chunk_size * i
    bytes = min(chunk_size, source_size - offset)
    with FileChunkIO(source_path, 'r', offset=offset,
            bytes=bytes) as fp:
        mp.upload_part_from_file(fp, part_num=i + 1)

print "before complete"
# Finish the upload
mp.complete_upload()

中断后续传

假如上传文件过程中断,如何恢复上传呢?我们首先需要有 upload_id。

   import boto
   import boto.s3.connection
   from boto.s3.multipart import MultiPartUpload

   CONS_AK = 'RC35MU8KM1PMEQ4EFD46'
   CONS_SK = 'Fg1KO10FS4uIPzSoKenmKAR2YHt052rM9u8VDik9'
   
   # Connect to S3
   c = boto.connect_s3(
               aws_access_key_id=CONS_AK,
               aws_secret_access_key=CONS_SK,
               host='yhg-2',
               port=80,
               is_secure=False,
               calling_format=boto.s3.connection.OrdinaryCallingFormat()
           )
   
   bucket_name = 'mybucket'
   b = c.get_bucket(bucket_name)
   mul_key = 'my-multi-obj'
   
   upload_id = '2~QfkgBbGqlzGDNPbGCvTyREOudXl4YY4'
   mp = MultiPartUpload(b)
   mp.key_name = mul_key
   mp.bucket_name = 'mybucket'
   mp.id = upload_id
   
   # Continue mp.upload_part_from_file() 
   # Finish the upload
   mp.complete_upload()

对于rgw,也可以通过如下命令查看中断的上传操作

# rados -p .rgw.buckets.extra ls --cluster yhg


<think> 我们正在处理一个关于Spring Boot中文件上的问题,特别是使用@PostMapping和MultipartFile来接收文件以及可能伴随的参数。 根据引用,我们有三种不同的代码示例: 1. 引用[1]: 上单个文件,不包含其他参数。方法参数中使用了@RequestParam("file") MultipartFile multipartFile。 2. 引用[2]: 同时接收文件和一个复杂对象(DTO)。这里使用了两个参数:@RequestParam("file") MultipartFile file 和 @RequestPart() DataDTO dataDTO。 3. 引用[3]: 前端上多个文件并携带其他参数(如name),后端用一个实体类来接收,该实体类包含MultipartFile数组和字符串字段。 用户的问题:想了解Java @PostMapping方法upload接收MultipartFile文件及多个请求参数并处理的相关技术内容。 因此,我们需要解释如何在一个@PostMapping方法中同时接收文件(单个或多个)和多个请求参数(简单类型或复杂对象)。 回答结构: 1. 概述:介绍使用场景(文件上同时带参数) 2. 后端接收方式: a. 接收单个文件及简单参数(使用多个@RequestParam) b. 接收单个文件及复杂对象(使用@RequestPart) c. 接收多个文件及参数(使用一个封装对象或分别接收) 3. 前端如何发送请求(简要提及,因为重点是后端) 4. 注意事项:包括错误处理(例如文件为空)、文件存储等 5. 代码示例:结合引用中的例子,给出一个综合的例子 注意:根据系统指令,所有行内数学表达式用$...$,独立公式单独成段,但我们这里主要是代码和文本,所以数学表达式可能很少。另外,生成相关问题。 由于用户要求生成相关问题,我们将在最后添加相关问题。 另外,引用标识:我们在引用参考的地方加上[^1][^2][^3]。 </think> ### Java @PostMapping 接收 MultipartFile 文件及多个参数的技术解析 #### 1. **核心实现原理** 在 Spring Boot 中处理文件上需要满足两个条件: - **`multipart/form-data` 请求**:前端需设置表单类型为 `enctype="multipart/form-data"`[^1] - **依赖支持**:需添加 `spring-boot-starter-web` 依赖,自动集成 `MultipartResolver`[^1] #### 2. **参数绑定方式** | 场景 | 实现方案 | 代码示例 | |------|----------|----------| | **文件 + 简单参数** | 多个 `@RequestParam` 并列 | ```java @PostMapping("/upload") public String upload( @RequestParam("file") MultipartFile file, @RequestParam("name") String name) { ... } ``` | | **文件 + 复杂对象** | `@RequestPart` 绑定对象 | ```java @PostMapping("/upload") public String upload( @RequestParam("file") MultipartFile file, @RequestPart UserDTO user) { ... } // UserDTO含name/age等字段 ``` [^2] | | **多文件 + 参数** | 封装对象接收 | ```java @Data public class UploadVO { private String category; private MultipartFile[] files; // 多文件数组 } @PostMapping("/multi") public String multiUpload(UploadVO vo) { ... } ``` [^3] | #### 3. **关键技术细节 - **文件处理 API**: ```java multipartFile.getBytes() // 获取二进制数据 multipartFile.transferTo() // 保存到本地(需处理 IOException) multipartFile.isEmpty() // 检查空文件 ``` - **前端参数递**: ```html <!-- Vue3 示例 --> <input type="text" name="category"> <input type="file" multiple @change="handleFiles"> <!-- 后端通过 MultipartFile[] 接收 --> ``` #### 4. **错误处理要点 ```java try { if (file.isEmpty()) throw new RuntimeException("空文件"); file.transferTo(new File("/uploads/" + filename)); } catch (IOException e) { throw new RuntimeException("存储失败: " + e.getMessage()); } ``` #### 5. **性能优化建议 - **大文件处理**:配置 `spring.servlet.multipart.max-file-size`(默认1MB) - **异步上**:结合 `@Async` 实现非阻塞处理 - **云存储**:集成 AWS S3 或 MinIO 替代本地存储 #### 6. **应用场景示例 - 用户头像上(文件 + 用户ID) - 商品图片批量上(多文件 + 商品分类) - 合同签署(PDF文件 + 合同元数据) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值