当前位置: 首页 > 知识库问答 >
问题:

Xcode Swift/PHP/SQL上载多个图像失败

莘睿
2023-03-14

我正在学习“将图像上传到服务器”,但当我尝试上传多个图像时,总是无法报告(JSON错误,来自iOS设备上的Xcode警报),似乎错误在PHP端?但我是新来的,所以任何人都可以帮我找到解决办法。Xcode:

>

  • httpBody函数

    func createBodyWithParameters(参数:[字符串:任意]?,边界:字符串)-

     if parameters != nil {
         for (key, value) in parameters! {
             body.append("--\(boundary)\r\n".data(using: .utf8)!)
             body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
             body.append("\(value)\r\n".data(using: .utf8)!)
         }
     }
    
     for image in images {
         let filename = "\(NSUUID().uuidString).jpg"
         let imageData = image.jpegData(compressionQuality: 1)
         let lineOne = "--" + boundary + "\r\n"
         body.append(lineOne.data(using: .utf8, allowLossyConversion: false)!)
         let lineTwo = "Content-Disposition: form-data; name=\"files\"; filename=\"\(filename)\"\r\n"
         body.append(lineTwo.data(using: .utf8, allowLossyConversion: false)!)
         let lineThree = "Content-Type: image/jpg\r\n\r\n"
         body.append(lineThree.data(using: .utf8, allowLossyConversion: false)!)
         body.append(imageData!)
         let lineFive = "\r\n"
         body.append(lineFive.data(using: .utf8, allowLossyConversion: false)!)
     }
    
     let lineSix = "--" + boundary + "--\r\n"
     body.append(lineSix.data(using: .utf8, allowLossyConversion: false)!)
     return body
    

    }

    http请求函数

     func createRequest(parameters: [String : Any] , url : URL) -> URLRequest {
    
     var request = URLRequest(url: url)
     request.httpMethod = "POST"
     let boundary = "Boundary-\(NSUUID().uuidString)"
     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
     request.httpBody = createBodyWithParameters(parameters: parameters, boundary: boundary) as Data
    
     return request
    

    }

    多图像上载函数func uploadPostWithMultipleImages(){

     guard let id = currentUser?["id"], let text = postTextView.text else {
         return
     }
    
     // declaring keys and values to be sent to the server
     let parameters = ["user_id": id, "text": text, "files": images]
    
     // declaring URL and request
     let url = URL(string: "http://localhost/projectExample/uploadPostMultipleImages.php")!
    
     let request = createRequest(parameters: parameters, url: url)
    
     URLSession.shared.dataTask(with: request) { (data, response, error) in
         DispatchQueue.main.async {
    
             // if error
             if error != nil {
                 Helper().showAlert(title: "Server Error", message: error!.localizedDescription, in: self)
                 return
             }
    
             // access data / json
             do {
    
                 // safe mode of accessing received data from the server
                 guard let data = data else {
                     Helper().showAlert(title: "Data Error", message: error!.localizedDescription, in: self)
                     return
                 }
    
                 // converting data to JSON
                 let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary
    
                 // safe mode of accessing / casting JSON
                 guard let parsedJSON = json else {
                     return
                 }
    
                 // if post is uploaded successfully -> come back to HomeVC, else -> show error message
                 if parsedJSON["status"] as! String == "200" {
    
                     // post notification in order to update the posts of the user in other viewControllers
                     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "uploadPost"), object: nil)
    
                     // comeback
                     self.dismiss(animated: true, completion: nil)
    
                 } else {
                     Helper().showAlert(title: "Error", message: parsedJSON["message"] as! String, in: self)
                     return
                 }
    
                 // error while accessing data / json
             } catch {
                 Helper().showAlert(title: "JSON Error", message: error.localizedDescription, in: self)
                 return
             }
         }
    
     }.resume()
    

    }

    PHP上传代码

     // generating absolute path to the folder for every user with his unique id
    

    ##############################################################################################################

    //如果(!file_exists($folder)){mkdir($folder,0777,true);}或者{$return['folder_message']='无法创建目录';}则创建不存在的fodler

     foreach($_FILES['files']['name'] as $key =>$value) {
    
     $file = $_FILES['files']['name'][$key];
     $file_tmp = $_FILES['files']['tmp_name'][$key];
     // path to the file. Full path of the file
     $path = $folder . '/' . basename($file); 
    
     if (move_uploaded_file($file_tmp, $path)) {
     // creating URL link to the image uploaded
     $pictures .= 'http://localhost/projectExample/posts/' . $user_id . '/' . $file. " ";
     $return['pictures'] = $pictures;
     }
    

    }//弗雷奇

    //将详细信息插入到数据库中

  • 共有1个答案

    吴伟志
    2023-03-14

    我使用了您的swift代码并成功上传了图像,所以我确信是您的PHP代码出现了一些错误。请确保返回的json格式正确,如:

    echo '{"code" : 200}'
    
     类似资料:
    • 我正在尝试上传图像与修改库。我就是这样上传的: 请求代码: 答复: 如果我是通过客户端浏览器(如postman或DHC)发布的,则请求与上面相同,并且我得到一个成功的XML响应。 请看我在邮递员客户端上尝试的截图。它是成功的。

    • 我正在尝试上载3个图像字段,将它们存储在我的数据库中,并将上载的文件移动到文件夹中。 目前,“image1”、“image2”、“image3”、“image4”字段正在插入MySQL数据库,但只有“image1”正在上载并移动到我的文件夹中。 这是我的密码: 如何移动文件夹中的其他图像(“image2”、“image3”、“image4”)? 我在代码中犯了什么错误?你能解释一下我哪里做错了吗?

    • 问题内容: 使用AJAX上传多张图片时遇到很多问题。我写这段代码: 的HTML jQuery / AJAX 我尝试了各种版本,但从未成功通过ajax发送多个数据。我已经按照这种方式尝试了以上所见,现在我仅获得POST信息。我知道为什么会收到POST,但我需要发送FILES信息,而且我不知道我哪里写错了。 我不是第一次使用Ajax,经常在大多数项目中使用它,但是我从未使用过发送多个文件,这现在困扰着

    • 一旦用户点击掩码映像,我们就允许用户上传自定义映像,如果只有一个掩码映像:https://codepen.io/kidsdial/pen/jjbvon就可以正常工作 要求: 但是如果有多个掩码映像,那么用户也应该能够上传所有掩码映像上的自定义映像[类似https://codepen.io/kidsdial/pen/rrmypr],但是现在它只适用于单个映像.... 2图像代码页:https://c

    • 一旦用户点击掩码映像,我们就允许用户上传自定义映像,如果只有一个掩码映像:https://codepen.io/kidsdial/pen/jjbvon就可以正常工作 要求: 但是如果有多个掩码映像,那么用户也应该能够上传所有掩码映像上的自定义映像[类似https://codepen.io/kidsdial/pen/rrmypr],但是现在它只适用于单个映像.... 2图像代码页:https://c

    • 问题内容: 我已经尝试进行这项工作了一段时间了。但是我似乎无法使其正常工作。我想只使用一个输入就拥有多张图片上传表格。 这是我的upload.php 如果我把线 使用相应的结束括号,它似乎可以正常工作。图像完美上传。但事实是,它只允许我上传一个。 请我真的需要您的专业知识。谢谢 问题答案: extract($_POST); $error=array(); $extension=array(“jpe