Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift+Alamofire上传带有exif数据的照片_Ios_Swift_Alamofire_Exif - Fatal编程技术网

iOS Swift+Alamofire上传带有exif数据的照片

iOS Swift+Alamofire上传带有exif数据的照片,ios,swift,alamofire,exif,Ios,Swift,Alamofire,Exif,我正在使用上传多个文件在同一时间使用,我能够得到这项工作,但是,大部分的EXIF数据正在剥离。不幸的是,EXIF数据是必须的,因为我们需要通过各种web客户端挖掘GPS标签和其他一些东西的能力 在做了一些研究之后,我发现问题是因为我使用UIImageJPEG表示法将照片转换为NSData,这是Alamofire所期望的,或者是一个文件URL,我认为这对我不起作用 我还使用该库允许用户拍摄/选择多张照片,这将返回一个数组,然后将其转换为NSData。以下是我在CollecteImage是全局字典的

我正在使用上传多个文件在同一时间使用,我能够得到这项工作,但是,大部分的EXIF数据正在剥离。不幸的是,EXIF数据是必须的,因为我们需要通过各种web客户端挖掘GPS标签和其他一些东西的能力

在做了一些研究之后,我发现问题是因为我使用UIImageJPEG表示法将照片转换为NSData,这是Alamofire所期望的,或者是一个文件URL,我认为这对我不起作用

我还使用该库允许用户拍摄/选择多张照片,这将返回一个数组,然后将其转换为NSData。以下是我在CollecteImage是全局字典的情况下执行此操作的函数:

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)")
        }
    }
我认为如果我可以使用从相位集到手机本地图像的完整路径,我可以保留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数据,我不会在上传过程中使用它

我认为您可以首先从PHAsset获取文件URL,然后在调用multipartFormData.appendBodyPart时使用该文件URL。。。。大概是这样的:

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

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

multipartFormData.appendBodyPartfileURL:imageURL,名称:image


我不知道为什么fullSizeImageURL会出现问题,但我知道它确实让我找到了正确的路径,因为我能够通过从文件路径中获取图像作为NSData来实现这一点,如下所示:

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

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

Ahh,听起来很有希望,但它不起作用……现在我得到一个错误文件URL无法访问:file:///var/mobile/Media/DCIM/102APPLE/IMG_2469.JPG. 不知道为什么不能联系到它?我刚刚检查了255行,看起来这是在检查OSX10.10操作系统还是什么?我真的不知道那里发生了什么。