iOS Swift + Alamofire使用exif数据上传照片

时间:2016-08-22 16:41:53

标签: ios swift alamofire exif

我正在使用Alamofire使用Open Asset同时将多个文件上传到their REST API,我可以让它工作,但是,大多数EXIF数据都是剥离出来。遗憾的是,EXIF数据是必须的,因为我们需要能够通过各种Web客户端挖掘GPS标签和其他一些东西。

在做了一些研究之后,我发现问题是因为我正在使用UIImageJPEGRepresentation将照片转换为NSData(这是Alamofire所期望的,或者是文件URL,我不知道我觉得这对我有用吗?)

我还使用BSImagePicker库来允许用户拍摄/选择多张照片,这会返回一个PHAsset的数组,然后转换为NSData。这是我执行此操作的函数(其中collectedImages是全局字典):

func compressPhotos(assets: [PHAsset]) -> Void {
        for asset in assets {
            let filename = self.getOriginalFilename(asset)
            let assetImage = self.getAssetPhoto(asset)

            let compressedImage = UIImageJPEGRepresentation(assetImage, 0.5)!  // bye bye metadata :(
            collectedImages[filename] = compressedImage
            print("compressed image: \(filename)")
        }
    }

如果我可以使用PHAsset到手机本地图片的完整路径,我想我可以保留EXIF数据,但Alamofire似乎不支持。我希望我错了。这是我的上传者:

func uploadPhotos(projectId: String, categoryId: String, data: [String: NSData], completionHandler: (AnyObject?, NSError?) -> ()) {
        var jsonBody = [AnyObject]()  //lazy
        Alamofire.upload(
            .POST,
            self.url + "/Files",
            multipartFormData: { multipartFormData in
                for (filename, img) in data {
                    jsonBody.append(["project_id": projectId, "category_id": categoryId, "original_filename": filename])
                    multipartFormData.appendBodyPart(data: img, name: "file", fileName: filename, mimeType: "image/jpeg")
                    print("img size: \(img.length)")

                }
                let jsonData = jsonToNSData(jsonBody)
                print("_jsonBody: \(jsonBody)")
                multipartFormData.appendBodyPart(data: jsonData!, name: "_jsonBody")
                print("multipart: \(multipartFormData)")
            },
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint(response)
                        switch response.result {
                        case .Success(let value):
                            completionHandler(value as? NSArray, nil)
                        case .Failure(let error):
                            completionHandler(nil, error)
                        }

                    }
                case .Failure(let encodingError):
                    print(encodingError)
                }
            }
        )
    }

所以我的问题是,在维护所有EXIF数据的同时,如何上传多张照片(同时传递其他参数)? Alamofire是一个很棒的库,我想在这里使用它,但如果我不能保留EXIF数据,我就不会为它上传过程。

2 个答案:

答案 0 :(得分:1)

我认为您可以先从PHAsset获取文件URL,然后在调用multipartFormData.appendBodyPart(...)时使用该文件URL。像这样:

  1. 从PHAsset获取网址:

    [asset requestContentEditingInputWithOptions:editOptions
                           completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
    NSURL *imageURL = contentEditingInput.fullSizeImageURL;
    }];
    
  2. 在AlamoFire API中使用文件URL:

    multipartFormData.appendBodyPart(fileURL: imageURL, name: "image")

答案 1 :(得分:1)

我不确定为什么我遇到fullSizeImageURL的问题,但我确实引导我走上正确的道路,因为我可以通过将图像作为NSData来实现这一点像这样的文件路径:

asset.requestContentEditingInputWithOptions(PHContentEditingInputRequestOptions()) { (input, _) in
    let fileURL = input!.fullSizeImageURL?.filePathURL
    let data = NSData(contentsOfFile: fileURL!.path!)!

然后我在Alamofire.request()作为data参数传递了它。这保留了所有原始照片元数据。