簡體   English   中英

使用 Vapor 正確更新多個文件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM