2016-08-22 8 views
0

을 사용하여 Open AssetOpen Asset으로 동시에 여러 파일을 업로드하고 있는데이 파일을 their REST API으로 사용할 수는 있지만 대부분의 EXIF ​​데이터가 삭제됩니다. 불행하게도, EXIF ​​데이터는 GPS 태그와 다양한 웹 클라이언트를 통한 몇 가지 다른 것들을 필요로하는 것처럼 필수적입니다.iOS Swift + Alamofire에서 exif 데이터로 사진 업로드

몇 가지 연구를하고 후에, 나는 내가 NSData에 사진을 변환 할 수 UIImageJPEGRepresentation을 사용하고 있기 때문에 문제가 발견 (Alamofire가 기대이나 내가 날 위해 일하는 것이라고 생각하지 않는 fileURL, 무엇이다?).

BSImagePicker 라이브러리를 사용하여 사용자가 복수의 사진을 선택하거나 선택할 수 있도록 허용하는 경우 으로 변환되는 PHAsset의 배열이 반환됩니다. 여기에 (collectedImages 글로벌 사전이다) 이렇게 내 기능입니다 : 내가 전화 로컬 이미지에 PHAsset에서 전체 경로를 사용할 수 있다면 나는 EXIF ​​데이터를 유지할 수 있다고 생각

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)") 
     } 
    } 

하지만, Alamofire은이를 지원하지 않는 것으로 보입니다. 나는 그것이 틀렸다는 것을 희망한다. 모든 EXIF ​​데이터를 유지하면서 (너무 다른 매개 변수를 전달하면서)

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) 
       } 
      } 
     ) 
    } 

그래서 제 질문은, 어떻게 여러 장의 사진을 업로드 할 수있다

: 여기 내 업 로더는? Alamofire은 멋진 라이브러리이며 여기에서 사용하고 싶습니다. 그러나 EXIF ​​데이터를 보관할 수없는 경우 업로드 프로세스와 결혼하지 않았습니다.

답변

0

나는 확실하지 않다 fullSizeImageURL과 관련하여 문제가 발생했지만 올바른 경로로 인도했습니다.

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

그리고 난 그냥 통과 그 Alamofire.request()data 인수 :이 같은 파일 경로에서 NSData로 이미지를 얻어서 작업이를 얻을 수 있었다. 이렇게하면 모든 원본 사진 메타 데이터가 유지됩니다.

1

먼저 PHAsset에서 파일 URL을 가져온 다음 multipartFormData.appendBodyPart (...) 호출에서 해당 파일 URL을 사용할 수 있다고 생각합니다. PHAsset에서

  1. 가져 오기 URL : 이런 식으로 뭔가

    [asset requestContentEditingInputWithOptions:editOptions 
             completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
    NSURL *imageURL = contentEditingInput.fullSizeImageURL; 
    }]; 
    
  2. 를 사용하여 파일의 URL AlamoFire API의 : 나는 왜

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

+0

아, 그 약속이 들리 겠지만 작동하지 않습니다 ... 이제 오류가 발생했습니다. '파일 URL에 연결할 수 없습니다. file : ///var/mobile/Media/DCIM/102APPLE/IMG_2469.JPG'' 왜 도달 할 수 없는지 모르겠다. (소스 코드) (https://github.com/Alamofire/Alamofire/blob/master/Source/MultipartFormData.swift) (255 행)를 확인하면 이것은 OS X 10.10 운영 체제 또는 그 밖의 것을 확인하고 있습니까? 실제로 어떤 일이 일어나고 있는지 모르겠습니다. – crmackey

관련 문제