#swift
Вопрос:
Я пытаюсь загрузить несколько файлов на сервер с помощью своего iPhone. Проблема в том, что когда я пытаюсь загрузить файл размером 1,4 МБ, он не может быть загружен должным образом. Я проверил загруженный файл, и размер файла составляет 1 кб. Поэтому я сделал этот код на основе почтальона. Как вы знаете, почтальон может создать код в соответствии с тем, на каком языке вы хотите. Спасибо.
function uploadFile(){ var parameters: [[String: Any]] = [] var fileCount: Int = 0 let homeDirectory = "" var soundPath = "(homeDirectory)(CommonUtil.PATH_SOUND)" soundPath = soundPath.replacingOccurrences(of: "file:///", with: "") //fiels[0] = ["fileName" : "2021_10_19_09_12_52.wav"] //fiels[1] = ["fileName" : "2021_10_19_09_12_53.wav"] //fiels[3] = ["fileName" : "2021_10_19_09_12_54.wav"] for item in files{ var dict = item as! [String:String] let strFilePath = "(soundPath)(dict["fileName"]!)" if FileManager.default.fileExists(atPath: strFilePath){ var dict = [String:Any]() dict.updateValue("strFileName[(fileCount)]", forKey: "key") dict.updateValue(strFilePath, forKey: "src") dict.updateValue("file", forKey: "type") parameters.append(dict) fileCount } print(dict["fileName"]!) } var dict = [String:Any]() dict.updateValue("strApiName", forKey: "key") dict.updateValue("soundFileUpload", forKey: "value") dict.updateValue("text", forKey: "type") parameters.append(dict) uploadFiles(parameters: parameters) } func uploadFiles(parameters: [[String: Any]]){ var semaphore = DispatchSemaphore(value: 0) let boundary = "Boundary - (UUID().uuidString)" var body = "" var error: Error? = nil for param in parameters { if param["disabled"] == nil { let paramName = param["key"]! body = "--(boundary)rn" body = "Content-Disposition:form-data; name="(paramName)"" if param["contentType"] != nil { body = "rnContent-Type: (param["contentType"] as! String)" } let paramType = param["type"] as! String if paramType == "text" { let paramValue = param["value"] as! String body = "rnrn(paramValue)rn" } else { let paramSrc = param["src"] as! String //let fileData = URL(string: paramSrc)?.dataRepresentation ?? Data() let fileData = try! NSData(contentsOfFile:paramSrc, options:[]) as Data let fileContent = String(data: fileData, encoding: .utf8) body = "; filename="("file:///" paramSrc)"rn" "Content-Type: "content-type header"rnrn(fileContent)rn" } } } body = "--(boundary)--rn"; let postData = body.data(using: .utf8) var request = URLRequest(url: URL(string: "http://api.polytus.com/")!,timeoutInterval: Double.infinity) request.addValue("multipart/form-data; boundary=(boundary)", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data else { DispatchQueue.main.async { self.showLoading(show: false) self.showBluetoothAlert(message: "failed") } print(String(describing: error)) semaphore.signal() return } DispatchQueue.main.async { self.showLoading(show: false) self.showBluetoothAlert(message: "success") } print(String(data: data, encoding: .utf8)!) semaphore.signal() } task.resume() semaphore.wait() }
Ответ №1:
Насколько я понимаю, вы хотите знать размер файла в файловой системе сервера. Если вы этого хотите, вам нужно использовать API, который вернет вам данные после загрузки файла и перемещения из временного пространства веб-сервера в конечное местоположение. Короче говоря, вам нужно выполнить 2 запроса, один для загрузки и один для получения данных файла (места или любых других необходимых данных), или разработать API, который даст вам в качестве ответа правильный размер загружаемого файла.
Комментарии:
1. Привет, Массимо Паванель. Спасибо за ответ, и я отредактировал свой вопрос, не могли бы вы проверить, пожалуйста.
2. Искренне говоря, я использую для этих целей фреймворк Alamofire, в целом это проще и меньше работы. Но, судя по тому, что вы говорите, проблема на стороне сервера. Когда вы загружаете, и у вас возникла проблема, каков ответ API или веб-сервера?