Загрузка нескольких файлов в Swift

#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 или веб-сервера?