[英]Updating multiples files with Vapor properly
我正在做一个带有蒸汽的项目,我正在尝试制作一个 function 来编辑带有多张图片的项目,但我不知道如何正确地制作更新图片。
目前,我的 func 真的很长(200 行:o,我想添加其他图片)而且我没有如何做得更正确。
谢谢你的帮助:)
''''
func editItemPostHandler(_ req: Request) throws
-> EventLoopFuture<Response> {
let updateData =
try req.content.decode(CreateItemFormData.self)
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMap { item in
// 3
item.title = updateData.title
item.price = updateData.price
item.description = updateData.description
item.condition = updateData.condition
item.weight = updateData.weight
item.$category.id = updateData.categoryID
item.$size.id = updateData.sizeID
item.$genderCollection.id = updateData.collectionGenderID
item.$brand.id = updateData.brandID
if !updateData.picture.isEmpty && !updateData.frontPicture.isEmpty {
let imageName = "\(UUID()).jpg"
let NewPath =
req.application.directory.workingDirectory +
imageFolder + imageName
let frontPictureImageName = "\(UUID()).jpg"
let frontPictureNewPath =
req.application.directory.workingDirectory +
imageFolder + frontPictureImageName
return req.fileio
.writeFile(.init(data: updateData.picture), at: NewPath)
.flatMap {
return req.fileio
.writeFile(.init(data: updateData.frontPicture), at: frontPictureNewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let filename = item.pictures
// 3 3. Construct the path of the picture.
let oldPicturePath = req.application.directory
.workingDirectory + imageFolder + filename
let frontPicturefilename = item.frontPicture
// 3 3. Construct the path of the picture.
let oldFrontPicturePath = req.application.directory
.workingDirectory + imageFolder + frontPicturefilename
do {
try FileManager.default.removeItem(atPath: oldPicturePath)
try FileManager.default.removeItem(atPath: oldFrontPicturePath)
}
item.pictures = imageName
item.frontPicture = frontPictureImageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
// 5
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
}
else if !updateData.picture.isEmpty {
let imageName = "\(UUID()).jpg"
let NewPath =
req.application.directory.workingDirectory +
imageFolder + imageName
return req.fileio
.writeFile(.init(data: updateData.picture), at: NewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let filename = item.pictures
let oldPicturePath = req.application.directory
.workingDirectory + imageFolder + filename
do {
try FileManager.default.removeItem(atPath: oldPicturePath)
}
item.pictures = imageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
// 5
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
else if !updateData.frontPicture.isEmpty {
let frontPictureImageName = "\(UUID()).jpg"
let frontPictureNewPath =
req.application.directory.workingDirectory +
imageFolder + frontPictureImageName
return req.fileio
.writeFile(.init(data: updateData.frontPicture), at: frontPictureNewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let frontPicturefilename = item.frontPicture
// 3 3. Construct the path of the picture.
let oldFrontPicturePath = req.application.directory
.workingDirectory + imageFolder + frontPicturefilename
do {
try FileManager.default.removeItem(atPath: oldFrontPicturePath)
}
item.frontPicture = frontPictureImageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
else {
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
'''
谢谢你的帮助。
伊曼纽尔
更新,
我发现了一个棘手的策略,但它让我的代码更短:
当我编辑一个项目时,首先我将以前的图像路径的名称赋予新的图像路径。 如果有新图像(所以图像的数据不为空)我会更改此路径的名称。 之后,我将尝试使用 fileIO.writeFile 推送数据。 如果没有数据,则不写入任何内容,并且图像的路径保持不变。 如果有数据就会写入数据,之后会删除旧图片用:try FileManager.default.removeItem(atPath: oldPicturePath)
'''
func editItemPostHandler(_ req: Request) throws
-> EventLoopFuture<Response> {
let updateData =
try req.content.decode(CreateItemFormData.self)
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMap { item in
item.title = updateData.title
item.price = updateData.price
item.description = updateData.description
item.condition = updateData.condition
item.weight = updateData.weight
item.$category.id = updateData.categoryID
item.$size.id = updateData.sizeID
item.$genderCollection.id = updateData.collectionGenderID
item.$brand.id = updateData.brandID
// 1. give the former name of itemPicture to imageName
var imageName = item.pictures
// 2. if updateData.picture isn't empty, give a new name the image name
if !updateData.picture.isEmpty {
imageName = "\(UUID()).jpg"
}
// create a path with the name of the image
let NewPath =
req.application.directory.workingDirectory +
imageFolder + imageName
// same logic for the second picture
var frontPictureImageName = item.frontPicture
if !updateData.frontPicture.isEmpty {
frontPictureImageName = "\(UUID()).jpg"
}
let frontPictureNewPath =
req.application.directory.workingDirectory +
imageFolder + frontPictureImageName
// try to write the file with the data (if it's empty, nothing is write but the logic continue.
return req.fileio
.writeFile(.init(data: updateData.picture), at: NewPath)
.flatMap {
// same for the second picture
return req.fileio
.writeFile(.init(data: updateData.frontPicture), at: frontPictureNewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let filename = item.pictures
// Construct the path with the old picture name.
let oldPicturePath = req.application.directory
.workingDirectory + imageFolder + filename
let frontPicturefilename = item.frontPicture
// 3 3. Construct the path of the picture.
let oldFrontPicturePath = req.application.directory
.workingDirectory + imageFolder + frontPicturefilename
do {
// if the data isn't empty delete the former picture file
if !updateData.picture.isEmpty {
try FileManager.default.removeItem(atPath: oldPicturePath)
}
// same for the second picture
if !updateData.frontPicture.isEmpty {
try FileManager.default.removeItem(atPath: oldFrontPicturePath)
}
}
item.pictures = imageName
item.frontPicture = frontPictureImageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
// save the new item
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
}
}
'''
这很棘手,但它允许比以前更少的代码,并且能够向我的项目结构添加更多图片
这是我的项目结构:
'''
struct CreateItemFormData: Content {
let collectionGenderID: UUID
let categoryID: UUID
let sizeID : UUID
let brandID : UUID
let title: String
let price: String
let description: String
let condition: String
let weight: String
var picture: Data
var frontPicture: Data
}
'''
谢谢你,如果你有更好的解决方案,总是受欢迎的。 :)
祝你有美好的一天,伊曼纽尔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.