存储 🗄

Swift Version Vapor Version Circle CI codebeat badge codecov Readme Score GitHub license

一个简化多种存储和 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 📡

您的文件是 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 路径

为了使用 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 驱动需要 bucketaccessKeysecretKey,而 templatehostregion 是可选的。region 将默认为 eu-west-1host 将默认为 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 许可证开源的软件