【问题标题】:file upload using Vapor使用 Vapor 上传文件
【发布时间】:2017-03-22 05:21:23
【问题描述】:

我找不到任何处理文件上传的示例,尤其是如何保存到某个特定文件夹。

这里是代码,addVideo是一个HTTP POST multipart/form-data:

videos.post("addVideo") { req in

    // need to save req.multipart["video"] into /data/videos/

    return try JSON(node: ["status": 0, "message": "success"])
}

【问题讨论】:

标签: swift file-upload vapor


【解决方案1】:

示例如下:

vapor 2.0 服务器代码:

let d =drop.grouped("file");
d.post("updateFile") { req in
  let data = Data.init(bytes: (req.data["image"]?.bytes)!)
  let picName = req.data["name"]?.string ?? String();
  try Data(data).write(to: URL(fileURLWithPath: "/Users/xx/Desktop/\(picName).jpg"))
  return try JSON(node: ["status": 0, "message": "success"])
}

客户端代码:

Alamofire.upload(multipartFormData: { (multipartFormData) in

        multipartFormData.append(imageData!, withName: "image", fileName: "pic", mimeType:"image/jpg")

        multipartFormData.append("picName".data(using: .utf8)!, withName: "name")

    }, to: "http://0.0.0.0:8083/file/updateFile") { (encodingResult) in

        switch encodingResult {
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint(response)
            }
        case .failure(let encodingError):
            print(encodingError)
        }
}

【讨论】:

  • 感谢这个例子,但我们已经弄清楚它是如何工作的。无论如何,我在这里主要关心的是您从文件的字节创建 Data 实例。这意味着您将文件字节加载到内存中。想象一下你上传了视频——所以你从接收到的字节构造数据,加载到内存中,这需要时间和内存。我正在寻找的是一种只保存到文件而不加载到内存中的方法,就像只是写来处理。
  • 您找到更好的解决方案了吗? @ValeriiLider
【解决方案2】:

从您的Multipart.File 获取Bytes 并转换为Data

guard let file = request.multipart?["video"]?.file else {
  return "Not found"
}
try Data(file.data).write(to: URL(fileURLWithPath: "/data/videos/FILENAME"))

您可以从 File 对象获取 FILENAME 或自己创建。

【讨论】:

  • 谢谢,它可以工作,但是:有没有办法在不创建数据对象的情况下将字节保存到文件中?对于大文件,它需要时间才能执行,但我只需要保存到文件系统
  • 你知道谁来获取文件的绝对路径(与主机)吗?我得到类似 file:///path/to/folder 的东西,这没关系,但我想要myapp.herokuapp.com/images/image.jpg
  • 对我来说,let d = Data(req.data as? Primitive)let d = Data(req.body.bytes) 都不起作用。为什么?
【解决方案3】:

虽然其他答案解释了如何将数据保存为文件,但以下代码显示了如何将数据保存为数据库 blob:

guard 
    let name = request.data["filename"]?.string, 
    let blob = request.data["file"]?.bytes
else {
    throw Abort(.badRequest, reason: "Fields 'filename' and/or 'file' is invalid")
}
let user = try request.user()
let image = try Image(filename: name, user: user, file: blob)
try image.save()

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 2021-02-27
    • 1970-01-01
    • 2018-12-30
    • 2021-07-21
    • 2022-01-12
    • 2021-09-25
    • 2023-02-21
    相关资源
    最近更新 更多