[英]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.