我一直在开发一个可以拍照的应用程序,然后通过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)"
}
答案 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()
}