繁体   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