使用参数上传Swift PHP文件

时间:2017-07-24 23:48:06

标签: php ios swift parameter-passing

我一直在开发一个可以拍照的应用程序,然后通过PHP(POST)发送到服务器。一切正常,我得到了照片。但是现在我认为如果能够显示拍摄照片的用户的名字会更好。问题是,我不知道如何从这个函数发送参数到PHP $ _POST。我尝试使用request.httpBody,但是当我运行PHP文件时,它说变量中没有值。我的代码如下所示:

func subirFotoRequest(){
let url = URL(string: "http://192.168.0.155/BolsaTrabajo/imagen.php")

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

let postString = "username\(userName)&userlastname\(lastName)"
//Where userName and lastName are global variables declared before//

let request.httpBody = postString.data(using: String.Encoding.utf8)

let boundary = generateBoundaryString()

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

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

let image_data = UIImagePNGRepresentation(imageView.image!)

if(image_data == nil)
{
    return
}

let body = NSMutableData()
indicadorActividad.startAnimating()

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 = URLSession.shared.dataTask(with: request as URLRequest) {            (
    data, response, error) in

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

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

    print(dataString)
    //self.indicadorActividad.stopAnimating()



    do {
    DispatchQueue.main.async(execute: {
        self.indicadorActividad.stopAnimating()

        self.imageView.image = nil;
        });
    }
    catch{
        //Errores
    }


   }
   task.resume()       
  }    

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

2 个答案:

答案 0 :(得分:1)

<强>更新

放置userID的示例:

body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"userID\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("{value of userID}\r\n".data(using: String.Encoding.utf8)!)

<强>来源

您的代码使用form-data发布值。

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)!)

以上代码为密钥hi生成了值test。 只需输入您的用户名......就像这样。

答案 1 :(得分:1)

NSMutableURLRequest(或URLRequest)不能有多个httpBody。 (并且HTTP协议不能在单个请求中发送多个实体。)

所以,删除这些行:

    let postString = "username\(userName)&userlastname\(lastName)"
    //Where userName and lastName are global variables declared before//

    let request.httpBody = postString.data(using: String.Encoding.utf8)

(后一行必须导致编译时错误,但这是另一回事。)

并替换稍后分配httpBody的行:

    //### Use `Data` rather than `NSMutableData` in Swift.
    var body = Data()
    indicadorActividad.startAnimating()

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

    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition:form-data; name=\"username\"\r\n\r\n".data(using: .utf8)!)
    //### Assuming `userName` and `lastName` are non-Optional.
    body.append("\(userName)\r\n".data(using: .utf8)!)

    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition:form-data; name=\"userlastname\"\r\n\r\n".data(using: .utf8)!)
    body.append("\(lastName)\r\n".data(using: .utf8)!)

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

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

    //### No need to cast, when you use `Data`.
    request.httpBody = body

除了图像之外,如果要发送文本参数,还需要在代码中的{em> multipart 中添加其他部分,例如"test"。 (哦,它已经在Codus的答案中显示出来了。)

这不是强制要求你的代码工作,但是你的代码更多的是Swift-ish:

func subirFotoRequest() {
    //### If you eventually need forced-upwrapping, do it as soon as possible!
    let url = URL(string: "http://192.168.0.155/BolsaTrabajo/imagen.php")!

    //### Use `URLRequest` rather than `NSMutableURLRequest` in Swift.
    //### Please do not miss, it's `var` not `let`.
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    let boundary = generateBoundaryString()

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

    //### Consider using `guard` for early-return pattern.
    guard let image = imageView.image else {
        //### Silently ignoring unusual case may not be good for debugging.
        print("imageView.image == nil")
        return
    }

    //### (same as above)
    guard let image_data = UIImagePNGRepresentation(image) else {
        print("UIImagePNGRepresentation returned nil")
        return
    }

    //### Use `Data` rather than `NSMutableData` in Swift.
    var body = Data()
    indicadorActividad.startAnimating()

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

    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition:form-data; name=\"username\"\r\n\r\n".data(using: .utf8)!)
    //### Assuming `userName` and `lastName` are non-Optional.
    body.append("\(userName)\r\n".data(using: .utf8)!)

    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition:form-data; name=\"userlastname\"\r\n\r\n".data(using: .utf8)!)
    body.append("\(lastName)\r\n".data(using: .utf8)!)

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

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

    //### No need to cast, when you use `Data`.
    request.httpBody = body

    //### No need to cast, when you use `URLRequest`.
    let task = URLSession.shared.dataTask(with: request) {
        (data, response, error) in

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

        //### Use `String` rather than `NSString` in Swift.
        let dataString = String(data: data, encoding: .utf8)

        //### Supplying default value prevents output "Optional(...)".
        print(dataString ?? "Undecodable result")

        //### No code throws here.
        DispatchQueue.main.async {
            self.indicadorActividad.stopAnimating()

            self.imageView.image = nil
        }
    }
    task.resume()
}