我正在为备份服务创建一个 REST API,原则上这很简单:
- 用户被某些人识别
uid
; - 文件由一些标识
fid
; - 上传文件,用户
POST
sa 文件到/backups/<uid>
并返回位置 - 列出文件,返回用户
GET
s/backups/<uid>
和 s 的一些索引fid
- 要下载文件,用户从索引
GET
s/backup/<uid>/<fid>
中选择一个,然后返回文件。
现在,我想通过将上传和下载委托给 Amazon S3 之类的服务来大大减少到我的服务器的流量。
重定向下载不是问题,因为我可以执行常规重定向(301
或307
?)到一些生成的过期 URL。
但是上传怎么办?我希望有这样的东西:
- 用户(不知道 S3)开始
POST
向我的服务器发送文件 - 服务器只接收标题(不是整个文件!)
- 服务器在 S3 中确定一个位置,生成一个过期 URL
PUT
并重定向到它 - 客户端
PUT
将文件发送到服务器传递给它的 URL - 服务器收到上传成功的通知
关键是这一切都需要对用户尽可能透明。