【问题标题】:upload an image on a server Swift 4在服务器上上传图像 Swift 4
【发布时间】:2020-09-08 15:52:47
【问题描述】:

我正在使用 Swift 4 开发 iOS 应用程序。

我需要将应用程序中的图像上传到服务器上,以便稍后将其保存到数据库中。我为此寻找解决方案;首先我使用base64Encoding,图像转换为String并存储在数据库中,然后当我想上传这个图像时,我使用base64解码,但是,我得到一个黑色的image

所以,我尝试使用此代码将图像上传到服务器:

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet var image: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

}
@IBAction func selectPicture(_ sender: AnyObject) {

    let ImagePicker = UIImagePickerController()
    ImagePicker.delegate = self
    ImagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary

    self.present(ImagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    image.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.dismiss(animated: true, completion: nil)
}
@IBAction func upload_request(_ sender: AnyObject) {
    UploadRequest()
}
func UploadRequest()
{
    let url = URL(string: "http://192.168.101.13/upload.php")

    let request = NSMutableURLRequest(url: url!)
    request.httpMethod = "POST"

    let boundary = generateBoundaryString()


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

    if (image.image == nil)
    {
        return
    }

    let image_data = UIImagePNGRepresentation(image.image!)


    if(image_data == nil)
    {
        return
    }
    let body = NSMutableData()

    let fname = "test.png"
    let mimetype = "image/png"


    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append("hi\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)

    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)


    request.httpBody = body as Data

    let session = URLSession.shared


    let task = session.dataTask(with: request as URLRequest, completionHandler: {
        (
        data, response, error) in

        guard ((data) != nil), let _:URLResponse = response, error == nil else {
            print("error")
            return
        }

        if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        {
            print(dataString)
        }

    }) 

    task.resume()

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

}

和php代码:

if (move_uploaded_file($_FILES['file']['tmp_name'], "image.png")) {
echo "File uploaded: ".$_FILES["file"]["name"];}       

但是我收到了这些警告,并且图片没有上传到服务器上:

move_uploaded_file(image.png): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/upload.php
move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phprJ2M6j' to 'image.png' in /Applications/XAMPP/xamppfiles/htdocs/upload.php    

如何在服务器上成功上传图片。

【问题讨论】:

  • 你说“图片没有上传到服务器”。这是否意味着文件/Applications/XAMPP/xamppfiles/temp/phprJ2M6 不存在?
  • 是的,我就是这个意思。
  • 目录是否存在?你有权限写吗?
  • 是的,目录存在。我用chmod 777更改权限
  • 好吧,你发布的这句话让我觉得很奇怪:无法将 '/Applications/XAMPP/xamppfiles/temp/phprJ2M6j' 移动到 'image.png' - 不应该反过来?无法将“image.png”移动到 /YourDirectory?检查处理文件上传的 PHP 文件,并确保您没有尝试将文件位置保存到图像中。

标签: ios swift4


【解决方案1】:

以下代码适用于我的自定义图像名称`

    func HITtheSERVER(imageData:Data) {
         let formatter = DateFormatter()
                formatter.dateFormat = "yyyyMMdd_HHmmss"
                  let stringOfDateTimeStamp = formatter.string(from: Date())
           //        print("Date time stamp String: \(stringOfDateTimeStamp)")
            let remoteName = "IMG_\(stringOfDateTimeStamp)"+".png"
    let request = NSMutableURLRequest(url: myUrl!)
    request.httpMethod = "POST"
    let boundary = generateBoundaryString()

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

    var body = Data()
    let fname = remoteName
    let mimetype = "image/png"

    body.append("--\(boundary)\r\n".data(
        using: String.Encoding.utf8,
    allowLossyConversion: false)!)
    body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(
        using: String.Encoding.utf8,
    allowLossyConversion: false)!)
    body.append("hi\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
    body.append("Content-Disposition:form-data; name=\"myFile\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)

    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)

    body.append(imageData)
    body.append("\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
    request.setValue(String(body.count), forHTTPHeaderField: "Content-Length")

    request.httpBody = body


    let session = URLSession.shared

    let task = session.dataTask(with: request as URLRequest) {
        (
        data, response, error) in

        guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }

        let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print(dataString as Any)

    }

    task.resume()



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

【讨论】:

    【解决方案2】:

    如果我们有多个数据类型,如 Image 和 String 以及 body。在这种情况下,以下代码将有所帮助。

    `

    override func viewDidLoad() {
        super.viewDidLoad()
        let imageData = image.jpegData(compressionQuality: 0.1)
        
        let formatter = DateFormatter()
                    formatter.dateFormat = "yyyyMMddHHmmss"
                 let stringOfDateTimeStamp = formatter.string(from: Date())
                let devicekey =  UIDevice.current.identifierForVendor?.uuidString
    
                       //        print("Date time stamp String: \(stringOfDateTimeStamp)")
                let remoteName = "IMG\(stringOfDateTimeStamp)"+".jpg"
    
    
    
         let parameters = [
           [
             "key": "myFile",
             "src": imageData,
             "type": "image/png"
           ],
           [
             "key": "key",
             "value": "7d67b170-199c-4436-ad9d-cd5daf38f905",
             "type": "text"
           ]] as [[String : Any]]
    
         let boundary = "Boundary-\(UUID().uuidString)"
        
         var body = Data()
         var error: Error? = nil
         for param in parameters {
           if param["disabled"] == nil {
             let paramName = param["key"]!
             body.append("--\(boundary)\r\n".data(
                 using: String.Encoding.utf8,
             allowLossyConversion: false)!)
            
             body.append("Content-Disposition:form-data; name=\"\(paramName)\"".data(
                 using: String.Encoding.utf8,
             allowLossyConversion: false)!)
             let paramType = param["type"] as! String
             if paramType == "text" {
               let paramValue = param["value"] as! String
                
               body.append("\r\n\r\n\(paramValue)\r\n".data(
                   using: String.Encoding.utf8,
               allowLossyConversion: false)!)
             } else {
               let paramSrc = param["src"] as! Data
                let mimiType = param["type"]
                body.append("; filename=\"\(remoteName)\"\r\n".data(
                    using: String.Encoding.utf8,
                allowLossyConversion: false)!)
                
               body.append("Content-Type: \(mimiType!)\r\n\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
                
                body.append(paramSrc)
                body.append("\r\n".data(using: String.Encoding.utf8,allowLossyConversion: false)!)
              
             }
           }
         }
        body.append("--\(boundary)--\r\n".data(
                          using: String.Encoding.utf8,
                      allowLossyConversion: false)!)
        
            let request = NSMutableURLRequest(url: myUrl!)
               request.httpMethod = "POST"
               request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
               
               request.setValue(String(body.count), forHTTPHeaderField: "Content-Length")
    
               request.httpBody = body
               
               
               let session = URLSession.shared
    
               let task = session.dataTask(with: request as URLRequest) {
             (
             data, response, error) in
             
             guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
                 print("error\(error!)")
                 return
             }
             
             let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
             print(dataString as Any)
             
         }
    
    
         task.resume()
       
        
    }
    
    func generateBoundaryString() -> String
    {
    return "Boundary-\(NSUUID().uuidString)"}
    

    `

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2016-03-21
      相关资源
      最近更新 更多