Bild hochladen mit alamofire
Ich versuche, ein Bild hochladen, um server mit Alamofire aber mein code funktioniert nicht. Das ist mein code:
var parameters = ["image": "1.jpg"]
let image = UIImage(named: "1.jpg")
let imageData = UIImagePNGRepresentation(image)
let urlRequest = urlRequestWithComponents("http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/", parameters: parameters, imageData: imageData)
Alamofire.upload(urlRequest.0, data: urlRequest.1)
.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
println("\(totalBytesWritten) /\(totalBytesExpectedToWrite)")
}
.responseJSON { (request, response, JSON, error) in
println("REQUEST \(request)")
println("RESPONSE \(response)")
println("JSON \(JSON)")
println("ERROR \(error)")
}
und das ist urlRequestWithComponents methos:
func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {
//create url request to send
var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
let boundaryConstant = "myRandomBoundary12345";
let contentType = "multipart/form-data;boundary="+boundaryConstant
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
//create upload data to send
let uploadData = NSMutableData()
//add image
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData(imageData)
//add parameters
for (key, value) in parameters {
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
}
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
//return URLRequestConvertible and NSData
return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}
und das ist, was ich in der Konsole:
ANFRAGE { URL: http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ }
ANTWORT Optional( { URL: http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ } { status-code: 200, - Header {
"Accept-Ranges" = bytes;
Connection = close;
"Content-Length" = 345;
"Content-Type" = "text/html";
Date = "Tue, 25 Aug 2015 10:52:01 GMT";
"Last-Modified" = "Mon, 24 Aug 2015 03:54:55 GMT";
Server = Apache;
} })
JSON nil
FEHLER Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Der Vorgang konnte nicht abgeschlossen werden. (Kakao Fehler 3840.)" (Ungültiger Wert Zeichen 0.) UserInfo=0x7f8c68c1c130 {NSDebugDescription=Ungültiger Wert Zeichen 0.})
meine PHP-Inhalt:
JS:
<? php
echo $_FILES['image']['name'].
'<br/>';
//ini_set('upload_max_filesize', '10M');
//ini_set('post_max_size', '10M');
//ini_set('max_input_time', 300);
//ini_set('max_execution_time', 300);
$target_path = "uploads/";
$target_path = $target_path.basename($_FILES['image']['name']);
try {
//throw exception if can't move the file
if (!move_uploaded_file($_FILES['image']['tmp_name'], $target_path)) {
throw new Exception('Could not move file');
}
echo "The file ".basename($_FILES['image']['name']).
" has been uploaded";
} catch (Exception $e) {
die('File did not upload: '.$e - > getMessage());
} ?>
Mein code folgten diesem Vorschlag: Beim hochladen der Datei mit Parameter über Alamofire
.Bitte helfen Sie mir, danke
- Hast du die Lösung gefunden ?
- ich denke, es ist eine bewährte Methode zum hinzufügen von Validierung in der von responseJSON
.validate().responseJSON
- Finden Sie die Lösung per Alamofire 3+ mit multi-Parameter und Standard-Header. stackoverflow.com/a/34961720/2125010
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Rob ' s Antwort korrekt ist, hier ist die Swift 2.0 version, mit upload-Fortschritt update.
Einfach Kopieren und Fügen Sie den folgenden code ändern Sie die upload-URL, und fügen Sie Ihre Parameter ein. Sollte funktionieren wie ein Charme.
PS: MRProgress ist eine wunderbare Bibliothek, die für den Fortschritt aktualisieren!
Ihr Fehler ist Ihnen zu sagen, die Antwort ist kein gültiges JSON. Sie fordern
responseJSON
, was darauf hinweist, dass, Sie erwarten eine JSON-Antwort, aber Ihr server den code nicht generieren von JSON. Es gibt also zwei Lösungen:Ich würde vorschlagen, ändern Sie Ihre PHP-code zu erzeugen, JSON Antworten.
Beispielsweise, wenn Sie erfolgreich ist:
oder, wenn nicht erfolgreich, vielleicht:
Klar, Sie haben zu entfernen, die überflüssige
echo
Zeilen in der PHP, wenn du gehst, um JSON zurückgeben, aber ich hoffe, das veranschaulicht das Muster. Aber das wird eine Antwort generiert, die Sie analysieren können mit Alamofire istresponseJSON
(oder verwenden SieNSJSONSerialization
).Alternativ, Sie könnte sich ändern, die Alamofire code nicht erwarten JSON (z.B. call -
response
eher alsresponseJSON
), aber dann Parsen der Antworten wird weit schwieriger.Als eine kleine, nicht verbundene Problem ist, würde ich persönlich raten, nicht Gebäude, die Anforderung manuell, sondern lassen Sie Alamofire für Sie tun. Hier ist ein Beispiel aus der README:
Dies ist für Swift 3 und Alamofire 4. Siehe revision history für diese Frage, die für Vorherige Versionen.
.uploadProgress
- und/oder.downloadProgress
wie gezeigt, in der "Upload Progress" - Sektion der README-Datei, die im Upload von Daten auf einen Server.SWIFT 2 AlamoFire Gesamt-Lösung für image-upload-zu-REST-API
AlamoFire enthalten laden von vereinfachten Lösung. Alamofire.Anfrage-Methode enthält mehrere vereinfachte überlastung, welche das hochladen in einfacher Art und Weise. Durch die Verwendung von Alamofire.Anfrage( Methode Entwickler loswerden können-Codierung overhead.
Überprüfen Sie bitte meine Lösung unten.
Wurde die Lösung Getestet auf SWIFT 2.0