一个简化多种存储和 CDN 服务使用的软件包。
将 Storage
添加到软件包依赖项中(在您的 Package.swift
文件中)
dependencies: [
...,
.package(url: "https://github.com/nodes-vapor/storage.git", from: "1.0.0")
]
以及您的目标(例如 “App”)
targets: [
...
.target(
name: "App",
dependencies: [... "Storage" ...]
),
...
]
Storage 使开始上传和下载文件变得容易。只需注册一个网络驱动即可开始。
上传文件有几种不同的接口,最简单的是以下接口
Storage.upload(
bytes: [UInt8],
fileName: String?,
fileExtension: String?,
mime: String?,
folder: String,
on container: Container
) throws -> String
上述函数将尝试使用您选择的驱动和模板上传文件,并将返回一个 String
,表示文件的位置。
如果您想上传名为 profile.png
的图片,您的调用站点将如下所示
try Storage.upload(
bytes: bytes,
fileName: "profile.png",
on: req
)
您的文件是 base64 还是 data URI?没问题!
Storage.upload(base64: "SGVsbG8sIFdvcmxkIQ==", fileName: "base64.txt", on: req)
Storage.upload(dataURI: "data:,Hello%2C%20World!", fileName: "data-uri.txt", on: req)
从 URL 下载资源,然后将其重新上传到您的存储服务器。
Storage.upload(url: "http://mysite.com/myimage.png", fileName: "profile.png", on: req)
要下载先前上传的文件,您只需使用生成的路径。
// download image as `Foundation.Data`
let data = try Storage.get("/images/profile.png", on: req)
为了使用 CDN 路径的便利性,您需要在 Storage 上设置 CDN 基础 URL,例如在您的 configure.swift
文件中
Storage.cdnBaseURL = "https://cdn.vapor.cloud"
以下是如何为给定资源生成 CDN 路径。
let cdnPath = try Storage.getCDNPath(for: path)
如果您的 CDN 路径比 cdnUrl
+ path
更复杂,您可以构建 Storage 的可选 completionhandler 以覆盖默认功能。
Storage.cdnPathBuilder = { baseURL, path in
let joinedPath = (baseURL + path)
return joinedPath.replacingOccurrences(of: "/images/original/", with: "/image/")
}
删除文件可以按如下方式完成。
try Storage.delete("/images/profile.png")
Storage
有多种可配置选项。
网络驱动是负责与您的第三方服务交互的模块。默认且目前唯一的驱动是 s3
。
import Storage
let driver = try S3Driver(
bucket: "bucket",
accessKey: "access",
secretKey: "secret"
)
services.register(driver, as: NetworkDriver.self)
S3 驱动需要 bucket
、accessKey
和 secretKey
,而 template
、host
和 region
是可选的。region
将默认为 eu-west-1
,host
将默认为 s3.amazonaws.com
。
有时,您可能需要将文件上传到与 /file.ext
不同的方案。您可以通过在创建 S3Driver
时传入 pathTemplate
参数来实现这一点。如果省略该参数,则默认为 /#file
。
以下模板会将文件夹 images
中的 profile.png
上传到 /myapp/images/profile.png
let driver = try S3Driver(
bucket: "mybucket",
accessKey: "myaccesskey",
secretKey: "mysecretkey",
pathTemplate: "/myapp/#folder/#file"
)
别名是您模板中的特殊键,在上传时将被替换为动态信息。
注意:如果您使用别名,但在文件上传的调用站点未提供信息,Storage 将抛出 missingX
/malformedX
错误。
#file
:文件的名称和扩展名。
File: "test.png"
Returns: test.png
#fileName
:文件的名称。
File: "test.png"
Returns: test
#fileExtension
:文件的扩展名。
File: "test.png"
Returns: png
#folder
:提供的文件夹。
File: "uploads/test.png"
Returns: uploads
#mime
:文件的内容类型。
File: "test.png"
Returns: image/png
#mimeFolder
:根据文件的 mime 生成的文件夹。
此别名将检查文件的 mime 类型,如果是图像,则返回 images/original
,否则返回 data
File: "test.png"
Returns: images/original
#day
:当前日期。
File: "test.png"
Date: 12/12/2012
Returns: 12
#month
:当前月份。
File: "test.png"
Date: 12/12/2012
Returns: 12
#year
:当前年份。
File: "test.png"
Date: 12/12/2012
Returns: 2012
#timestamp
:上传时间。
File: "test.png"
Time: 17:05:00
Returns: 17:05:00
#uuid
:生成的 UUID。
File: "test.png"
Returns: 123e4567-e89b-12d3-a456-426655440000
此软件包由 Nodes 的 Vapor 团队开发和维护。
此软件包是根据 MIT 许可证开源的软件