Я пытался загрузить несколько изображений на сервер в быстром.
Это мой код:
Swift:
var images: Int16 = 0
var params: NSMutableDictionary = NSMutableDictionary()
var imageDataArray = [UIImage]()
func syncFile() {
let myUrl = NSURL(string: "http://localhost/app/imageUpload.php")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let authToken = prefs.valueForKey("authToken") as! String
let boundary = generateBoundaryString()request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
switch images {
case 0:
imageDataArray = []
case 1:
imageDataArray.append(self.imageView1.image!)
case 2:
imageDataArray.append(self.imageView1.image!)
imageDataArray.append(self.imageView2.image!)
case 3:
imageDataArray.append(self.imageView1.image!)
imageDataArray.append(self.imageView2.image!)
imageDataArray.append(self.imageView3.image!)
default:
break
}params = [
"auth_code" : "\(authToken)",
"id" : "\(idParam)",
"file" : imageDataArray
]
request.HTTPBody = createBodyWithParameters(params, filePathKey: "file", boundary: boundary)
func createBodyWithParameters(parameters: NSMutableDictionary?, filePathKey: String?, boundary: String) -> NSData {
let body = NSMutableData()
if parameters != nil {
for (key, value) in parameters! {
if(value is String || value is NSString){
body.appendString("--\(boundary)\r\n")
body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString("\(value)\r\n")
}
else if(value is [UIImage]){
var i = 0
for image in value as! [UIImage] {
let filename = "image\(i).png"let data = UIImagePNGRepresentation(image)
let mimetype = mimeTypeForPath(filename)
let fileKey = "file"
body.appendString("--\(boundary)\r\n")
body.appendString("Content-Disposition: form-data; name=\"\(fileKey)\"; filename=\"\(filename)\"\r\n")
body.appendString("Content-Type: \(mimetype)\r\n\r\n")
body.appendData(data!)
body.appendString("\r\n")
i = i + 1
}
}
}
}
body.appendString("--\(boundary)--\r\n")
return body
}
func generateBoundaryString() -> String
{
return "Boundary-\(NSUUID().UUIDString)"}
func mimeTypeForPath(path: String) -> String {
let pathUrl = NSURL(string: path)
let pathExtension = pathUrl!.pathExtension
var stringMimeType = "application/octet-stream"if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension!, nil)?.takeRetainedValue() {
if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
stringMimeType = mimetype as NSString as String
}
}
return stringMimeType;
}
И вот мой код PHP:
<?php
header('Content-type: application/json');
$target_dir = "uploads";
if(!file_exists($target_dir))
{
mkdir($target_dir, 0777, true);
}
$total = count($_FILES["file"]["name"]);
for($i=0; $i < $total; $i++){
$target_dir1 = $target_dir . "/" . basename($_FILES["file"]["name"][$i]);
if (move_uploaded_file($_FILES["file"]["tmp_name"][$i], $target_dir1))
{
echo json_encode([
"Message" => "The file ". basename( $_FILES["file"]["name"][$i]). " has been uploaded.",
"Status" => "OK"]);
} else {
echo json_encode([
"Message" => "Sorry, there was an error uploading your file.",
"Status" => "Error"]);
}}
?>
Но когда я распечатываю данные ответа, я получаю сообщение об ошибке: {«Сообщение»: «Извините, при загрузке файла произошла ошибка.», «Статус»: «Ошибка»}
Однако, если я удаляю цикл из кода php и загружаю только 1 изображение с таким же быстрым кодом, оно успешно загружает это изображение.
Задача ещё не решена.
Других решений пока нет …