gpt4 book ai didi

ios - 在 Swift 中上传带有参数的图像

转载 作者:IT王子 更新时间:2023-10-29 04:57:42 24 4
gpt4 key购买 nike

我正在尝试在 Swift 中上传带有参数的图像。当我尝试这段代码时,我可以获取参数但不能获取图像

uploadFileToUrl(fotiño:UIImage){
var foto = UIImage(data: UIImageJPEGRepresentation(fotiño, 0.2))


var request = NSMutableURLRequest(URL:NSURL(string: "URL"))
request.HTTPMethod = "POST"

var bodyData = "id_user="PARAMETERS&ETC""


request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
request.HTTPBody = NSData.dataWithData(UIImagePNGRepresentation(foto))
println("miraqui \(request.debugDescription)")
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
var HTTPError: NSError? = nil
var JSONError: NSError? = nil

var dataVal: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error: &HTTPError)

if ((dataVal != nil) && (HTTPError == nil)) {
var jsonResult = NSJSONSerialization.JSONObjectWithData(dataVal!, options: NSJSONReadingOptions.MutableContainers, error: &JSONError)

if (JSONError != nil) {
println("Bad JSON")
} else {
println("Synchronous\(jsonResult)")
}
} else if (HTTPError != nil) {
println("Request failed")
} else {
println("No Data returned")
}
}

编辑 2:

我认为我保存的 UIImage 的路径有问题,因为 php 告诉我该文件已经存在,我认为这是因为我将其空白发送

func createRequest (#userid: String, disco: String, id_disco: String, pub: String, foto: UIImage) -> NSURLRequest {
let param = [
"id_user" : userid,
"name_discoteca" : disco,
"id_discoteca" : id_disco,
"ispublic" : pub] // build your dictionary however appropriate

let boundary = generateBoundaryString()

let url = NSURL(string: "http....")
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.timeoutInterval = 60
request.HTTPShouldHandleCookies = false
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var imagesaver = ImageSaver()

var image = foto // However you create/get a UIImage
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let destinationPath = documentsPath.stringByAppendingPathComponent("VipKing.jpg")
UIImageJPEGRepresentation(image,1.0).writeToFile(destinationPath, atomically: true)


self.saveImage(foto, withFileName: "asdasd22.jpg")


var path = self.documentsPathForFileName("asdasd22.jpg")


self.ViewImage.image = self.loadImageWithFileName("asdasd22.jpg")



// let path1 = NSBundle.mainBundle().pathForResource("asdasd22", ofType: "jpg", inDirectory: path) as String!

**//path1 always crash**


println(param.debugDescription)
println(path.debugDescription)
println(boundary.debugDescription)




request.HTTPBody = createBodyWithParameters(param, filePathKey: "asdasd22.jpg", paths: [path], boundary: boundary)

println(request.debugDescription)


return request
}

最佳答案

在下面的评论中,您告知我们您正在使用 $_FILES 语法来检索文件。这意味着您要创建一个 multipart/form-data 请求。这个过程基本上是:

  1. 为您的multipart/form-data 请求指定边界。

  2. 指定请求的 Content-Type,指定它是 multipart/form-data 以及边界是什么。

  3. 创建请求正文,分隔各个组件(每个发布的值以及每次上传之间)。

有关详细信息,请参阅 RFC 7578 .无论如何,在 Swift 3 及更高版本中,这可能看起来像:

/// Create request
///
/// - parameter userid: The userid to be passed to web service
/// - parameter password: The password to be passed to web service
/// - parameter email: The email address to be passed to web service
///
/// - returns: The `URLRequest` that was created

func createRequest(userid: String, password: String, email: String) throws -> URLRequest {
let parameters = [
"user_id" : userid,
"email" : email,
"password" : password] // build your dictionary however appropriate

let boundary = generateBoundaryString()

let url = URL(string: "https://example.com/imageupload.php")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

let fileURL = Bundle.main.url(forResource: "image1", withExtension: "png")!
request.httpBody = try createBody(with: parameters, filePathKey: "file", urls: [fileURL], boundary: boundary)

return request
}

/// Create body of the `multipart/form-data` request
///
/// - parameter parameters: The optional dictionary containing keys and values to be passed to web service.
/// - parameter filePathKey: The optional field name to be used when uploading files. If you supply paths, you must supply filePathKey, too.
/// - parameter urls: The optional array of file URLs of the files to be uploaded.
/// - parameter boundary: The `multipart/form-data` boundary.
///
/// - returns: The `Data` of the body of the request.

private func createBody(with parameters: [String: String]? = nil, filePathKey: String, urls: [URL], boundary: String) throws -> Data {
var body = Data()

parameters?.forEach { (key, value) in
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.append("\(value)\r\n")
}

for url in urls {
let filename = url.lastPathComponent
let data = try Data(contentsOf: url)

body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(filePathKey)\"; filename=\"\(filename)\"\r\n")
body.append("Content-Type: \(url.mimeType)\r\n\r\n")
body.append(data)
body.append("\r\n")
}

body.append("--\(boundary)--\r\n")
return body
}

/// Create boundary string for multipart/form-data request
///
/// - returns: The boundary string that consists of "Boundary-" followed by a UUID string.

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

与:

extension URL {
/// Mime type for the URL
///
/// Requires `import UniformTypeIdentifiers` for iOS 14 solution.
/// Requires `import MobileCoreServices` for pre-iOS 14 solution

var mimeType: String {
if #available(iOS 14.0, *) {
return UTType(filenameExtension: pathExtension)?.preferredMIMEType ?? "application/octet-stream"
} else {
guard
let identifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),
let mimeType = UTTypeCopyPreferredTagWithClass(identifier, kUTTagClassMIMEType)?.takeRetainedValue() as String?
else {
return "application/octet-stream"
}

return mimeType
}
}
}

extension Data {

/// Append string to Data
///
/// Rather than littering my code with calls to `data(using: .utf8)` to convert `String` values to `Data`, this wraps it in a nice convenient little extension to Data. This defaults to converting using UTF-8.
///
/// - parameter string: The string to be added to the `Data`.

mutating func append(_ string: String, using encoding: String.Encoding = .utf8) {
if let data = string.data(using: encoding) {
append(data)
}
}
}

有了所有这些,您现在需要提交此请求。我建议这是异步完成的。例如,使用 URLSession,您可以执行如下操作:

let request: URLRequest

do {
request = try createRequest(userid: userid, password: password, email: email)
} catch {
print(error)
return
}

let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
// handle error here
print(error ?? "Unknown error")
return
}

// parse `data` here, then parse it

// note, if you want to update the UI, make sure to dispatch that to the main queue, e.g.:
//
// DispatchQueue.main.async {
// // update your UI and model objects here
// }
}
task.resume()

如果您要上传大型 Assets (例如视频等),您可能希望使用上述基于文件的排列。参见 https://stackoverflow.com/a/70552269/1271826 .


有关 Swift 2 版本,请参阅 previous revision of this answer .

关于ios - 在 Swift 中上传带有参数的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26162616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com