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

如何用Swift在iOS中上传图像到服务器?

田彬郁
2023-03-14

它不会工作,如何从iOS Swift应用程序发送图像到我的PHP服务器?

@IBAction func upload(sender: UIButton) {

    var imageData = UIImageJPEGRepresentation(img.image, 90)
   // println(imageData)
    let url = NSURL(string:"http://www.i35.club.tw/old_tree/test/uplo.php")
    //let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    //var request = NSMutableURLRequest(URL: url, cachePolicy: cachePolicy, timeoutInterval: 10)
    var request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"

    // set Content-Type in HTTP header
    let boundaryConstant = "----------V2ymHFg03esomerandomstuffhbqgZCaKO6jy";
    let contentType = "multipart/form-data; boundary=" + boundaryConstant
    NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request)
    request.HTTPBody = imageData
    // set data
    //var dataString = "adkjlkajfdadf"
    //let requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    //request.HTTPBody = requestBodyData


    //

    request.addValue(contentType, forHTTPHeaderField: "Content-Type")
    request.addValue("multipart/form-data", forHTTPHeaderField: "Accept")
    //
    // set content length

    //NSURLProtocol.setProperty(requestBodyData.length, forKey: "Content-Length", inRequest: request)

    var response: NSURLResponse? = nil
    var error: NSError? = nil
    let reply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error)

    let results = NSString(data:reply!, encoding:NSUTF8StringEncoding)
    println("API Response: \(results)")
}

//take photo
func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {


    var selectedImage : UIImage = image
     img.image = selectedImage
    UIImageWriteToSavedPhotosAlbum(selectedImage, nil, nil, nil)
    self.dismissViewControllerAnimated(true, completion: nil)

}

共有1个答案

咸亦
2023-03-14

我已经根据用户的选择拍摄了照片,并为swift 2和iOS9编写了代码

    func imageUploadRequest(imageView imageView: UIImageView, uploadUrl: NSURL, param: [String:String]?) {

        //let myUrl = NSURL(string: "http://192.168.1.103/upload.photo/index.php");

        let request = NSMutableURLRequest(URL:uploadUrl);
        request.HTTPMethod = "POST"

        let boundary = generateBoundaryString()

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

        let imageData = UIImageJPEGRepresentation(imageView.image!, 1)

        if(imageData==nil)  { return; }

        request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", imageDataKey: imageData!, boundary: boundary)

        //myActivityIndicator.startAnimating();

        let task =  NSURLSession.sharedSession().dataTaskWithRequest(request,
            completionHandler: {
                (data, response, error) -> Void in
                if let data = data {

                    // You can print out response object
                    print("******* response = \(response)")

                    print(data.length)
                    // you can use data here

                    // Print out reponse body
                    let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
                    print("****** response data = \(responseString!)")

                    let json =  try!NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as? NSDictionary

                    print("json value \(json)")

                    //var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err)

                    dispatch_async(dispatch_get_main_queue(),{
                        //self.myActivityIndicator.stopAnimating()
                        //self.imageView.image = nil;
                    });

                } else if let error = error {
                    print(error.description)
                }
        })
        task.resume()


    }


    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        let filename = "user-profile.jpg"

        let mimetype = "image/jpg"

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.appendData(imageDataKey)
        body.appendString("\r\n")

        body.appendString("--\(boundary)--\r\n")

        return body
    }

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

}// extension for impage uploading

extension NSMutableData {

    func appendString(string: String) {
        let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
        appendData(data!)
    }
}

------以下php端代码

<?php

$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$userId = $_POST["userId"];

$target_dir = "media";

if(!file_exists($target_dir))
{
mkdir($target_dir, 0777, true);
}

$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) 
{
echo json_encode([
"Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.",
"Status" => "OK",
"userId" => $_REQUEST["userId"]
]);

} else {

echo json_encode([
"Message" => "Sorry, there was an error uploading your file.",
"Status" => "Error",
"userId" => $_REQUEST["userId"]
]);

}
 类似资料:
  • 问题内容: 我想随请求一起发送图像作为参数。我使用下面的代码调用POST请求,但是我不知道如何将图像追加到正文中。 我通过图像选择器获取图像,如下所示: 我的要求如下 我是Swift的新手。我已经通过multipart / form-data看到了这一点,但无法自己实现。我不想将其编码为基本64格式。请帮助我。 问题答案: 我使用以下结构发送图像: 然后在函数中创建如下主体:

  • 问题内容: 如何从iPhone上的图片库以JSON格式将图片上传到服务器?我尝试了以下方法: 问题答案: 如果要以字符串形式上传图像,则必须将图像数据转换为Base64,然后可以使用上述方法: 要转换为base64字符串,请参阅此答案。然后,您可以使用您的代码进行上传。 其他方式 您可以像这样直接上传图片:

  • 问题内容: 我正在设置标头和正文,使用Post提取将图像上传到服务器上。我得到的响应码是200,但它不是上传图像,而是其余数据正在上传。 这是正文的代码: 请帮助。我正在犯什么错误。:( 问题答案: 我找到了解决方案: **文件名是可选的…

  • 经过一些研究,我发现了一个用于多部分文件上传的开放库。在我的情况下,我想上传一个图像使用PUT请求,其中的图像要么是从画廊或相机选择。以下是我正在使用的资源:1。https://github.com/gotev/android-upload-service2.https://www.simplifiedcoding.net/android-upload-image-to-server/#comme

  • 我已经为KeystoneJS的AdminUI编写了一个自定义字段,它使用了TinyMCE的编辑器。 KeystoneJS在下面运行Apollo GraphQL服务器,并根据CMS模式自动生成变化和查询。TinyMCE具有输入自定义挂钩以上载图像的功能。 我希望能够连接这两个——使用GraphQL将图像从TinyMCE上传到KeystoneJS的服务器。 例如,在我的设置中,我在CMS中有一个字段。

  • 问题内容: 我只想使用swift在firebase上上传多个图像。我现在正在上传一张图片,但无法上传多张图片。这是我的代码 问题答案: 当前没有直接API可以批量上传/下载文件。我们不能使用循环,因为所有任务都执行。我们可以做的是使用递归函数。 核心逻辑 完整代码示例 1.我创建了一个自定义类来上传文件 2.在这里我们如何使用 首先,为主要功能创建一个完成块,当您成功上传所有图像时,它将通知您。