2017-05-14 9 views
1

Ich versuche ein Bild, das von einem UIImagePickerController ausgewählt wurde, auf meinen Webserver hochzuladen, der auf AWS gehostet wird. Ich folge diesem Tutorial: https://www.udemy.com/swift-php-mysql-user-sign-up-sign-in-sign-out-and-more/learn/v4/overview und ich bekomme eine Reihe von Argument labels '(_:)' do not match any available overloads Fehler. Ich habe versucht, diesen Fehler zu suchen, aber ich habe nichts gefunden, das sich auf meinen aktuellen Code bezieht. Ich benutze nicht den Originalcode im Tutorial, ich versuche es in Swift3 zu übersetzen und benutze die folgende Antwort: iOS swift NSMutableData has no member appendString um den besten Programmierpraktiken zu folgen. Hier ist mein aktueller Code:swift3 - Bild auf Webserver hochladen

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 
    } 

Kann jemand erklären, was ich falsch mache? Vielen Dank!

Antwort

0

Sie können keine Daten wie folgt initialisieren:

Data("foo") 

Was können Sie tun, ist:

Data("foo".utf8) 

Wie in den Link, den Sie zur Verfügung gestellt. (Sie vermissen die .utf8)

EDIT: Ja der Typ sagte, er wollte diesen Code nicht verwenden, aber hören Sie mir zu, diese Version der Erweiterung erlaubt keine verlustreiche Verbindung, und solange Sie Schreibe alles in die Zeichenfolge, Daten werden nie Null sein.

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

Verbrauch:

body.appendString("foo") 

Nur initialisieren Körper wie folgt aus:

var body = NSMutableData() 

Und Rückkehr wie diese

return body as Data 
+0

Hallo @Nebojsa, Ich habe versucht, die utf8 am Ende hinzufügen, aber es gibt immer noch den gleichen Fehler. Ich fügte die Daten hinzu, weil der Typ in der anderen SO-Antwort erwähnte, dass Sie 'body.append (string:" - \ (boundary) \ r \ n ") nicht verwenden sollten. Was ist die beste Vorgehensweise, wenn Sie etwas tun? so was? Ich bekomme immer noch den gleichen Fehler. Irgendwelche Ideen? – Alan

+0

Welchen genauen Fehler bekommen Sie? Ich werde meine Antwort bald bearbeiten, ich habe diesen Code auf meinem Computer. –

+0

Das Problem wurde basierend auf Ihrer Antwort behoben. Ich benutzte die zweite Methode mit der Erweiterung und es funktionierte wie ein Zauber. Vielen Dank! – Alan

0

diesen Code Versuchen. Sie können diesen Code verwenden für 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 
} 

Nach dem obigen Code in Bilder zu Webserver hochladen Sie eine Funktion vor der Aufgabe in der Api-Funktion aufrufen müssen. Ich habe diesen Code unten erwähnt.