2017-05-14 2 views
1

UIImagePickerController에서 선택한 이미지를 AWS에서 호스팅되는 웹 서버에 업로드하려고합니다. 이 튜토리얼을 따르고 있습니다 : https://www.udemy.com/swift-php-mysql-user-sign-up-sign-in-sign-out-and-more/learn/v4/overview 그리고 나는 Argument labels '(_:)' do not match any available overloads 오류가 많습니다. 이 오류를 검색해 보았지만 현재 코드와 관련된 것을 발견하지 못했습니다. 튜토리얼에서 원래 코드를 사용하지 않고 Swift3으로 변환하고 다음 답변을 사용하려고합니다. iOS swift NSMutableData has no member appendString 최상의 코딩 방법을 따르십시오. 다음은 현재 코드입니다.swift3 - 웹 서버에 이미지 업로드

func createBodyWithParameters(_ parameters: [String: String]?, filePathKey: String?, imageDataKey: Data, boundary: String) -> Data { 
     var body = Data(); 

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.append(Data("--\(boundary)\r\n")) 
       body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")) 
       body.append(Data("\(value)\r\n")) 
      } 
     } 

     let filename = "user-profile.jpg" 

     let mimetype = "image/jpg" 

     body.append(Data("--\(boundary)\r\n")) 
     body.append(Data("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")) 
     body.append(Data("Content-Type: \(mimetype)\r\n\r\n")) 
     body.append(imageDataKey) 
     body.append(Data("\r\n")) 



     body.append(Data("--\(boundary)--\r\n")) 

     return body as Data 
    } 

누군가 내가 뭘 잘못하고 있는지 설명 할 수 있습니까? 감사!

답변

0

이 같은 데이터를 초기화 할 수 없습니다 : 당신이 할 수있는 것은

Data("foo") 

:

Data("foo".utf8) 

처럼 당신이 제공 한 링크. (당신은 .utf8이 없습니다.)

편집 : 네, 그 사람은 그 코드를 사용하고 싶지 않지만 내 말을 들었습니다.이 확장 버전은 손실 연결을 허용하지 않습니다. 문자열 안에 아무 것도 써 넣지 않으면 데이터가 전혀 없어지지 않습니다.

extension NSMutableData { 
    func appendString(_ string: String) { 
     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false) 
     append(data!) 
    } 
} 

사용법 :이 같은

body.appendString("foo") 

그냥 초기화 몸 :

var body = NSMutableData() 

그리고이

return body as Data 
+0

안녕하세요 @Nebojsa, 끝 부분에 utf8을 추가하려고했지만 여전히 동일한 오류가 발생합니다. 다른 사람의 대답에있는 사람이'body.append (문자열 : "- \ (경계) \ r \ n") '을 사용해서는 안된다고 언급했기 때문에 데이터를 추가하고있었습니다. 무언가를 할 때 가장 좋은 방법은 무엇입니까? 이거? 그래도 여전히 같은 오류가 발생합니다. 어떤 아이디어? – Alan

+0

정확한 오류는 무엇입니까? 내 답변을 곧 수정하겠습니다. 컴퓨터에이 코드가 있습니다. –

+0

답변에 따라 문제가 해결되었습니다. 확장 기능을 가진 두 번째 방법을 사용했고 매력처럼 작동했습니다. 감사! – Alan

0

같은 코드를 시도 돌아갑니다. 당신은 당신이 API 함수에서 작업하기 전에 함수를 호출 할 필요가 위의 코드 후 swift3

func generateBoundaryString() -> String 
{ 
    return "Boundary-\(NSUUID().uuidString)" 
} 

func photoDataToFormData(parameters: [String: String]?, data: Data, boundary:String, fileName:String) -> Data 
{ 
    var fullData = Data() 

    if parameters != nil { 
     for (key, value) in parameters! { 

      print ("Key: \(key), Value: \(value)") 
      let str = "--\(boundary)\r\n" + "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n" + "\(value)\r\n" 
      let data = str.data(using: String.Encoding.utf8, allowLossyConversion: true) 

      fullData.append(data!) 
     } 
    } 

    // 1 - Boundary should start with -- 
    let lineOne = "--" + boundary + "\r\n" 
    fullData.append(lineOne.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 2 
    let lineTwo = "Content-Disposition: form-data; name=\"image\"; filename=\"" + fileName + "\"\r\n" 
    NSLog(lineTwo) 
    fullData.append(lineTwo.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 3 
    let lineThree = "Content-Type: image/jpg\r\n\r\n" 
    fullData.append(lineThree.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 4 
    fullData.append(data) 

    // 5 
    let lineFive = "\r\n" 
    fullData.append(lineFive.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 6 - The end. Notice -- at the start and at the end 
    let lineSix = "--" + boundary + "--\r\n" 
    fullData.append(lineSix.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 
    return fullData 
} 

에서 웹 서버에 이미지를 업로드이 코드를 사용할 수 있습니다. 나는 아래 코드를 언급했다.

let imageData = UIImageJPEGRepresentation(profileImage.image!, 0.5) 

let boundary = generateBoundaryString() 

let fullData = photoDataToFormData(parameters: parameters as? [String : 
String], data: imageData!, boundary: boundary, fileName: "Test.jpg") 

request.setValue("multipart/form-data; boundary=" + boundary, 
forHTTPHeaderField: "Content-Type") 

    // REQUIRED! 
request.setValue(String(fullData.count), forHTTPHeaderField: "Content- 
Length") 

request.httpBody = fullData