У меня есть такой код ниже
func upload(){
let img = UIImage(named: "1")
let imgData = UIImageJPEGRepresentation(img!, 1)
let data = imgData?.base64EncodedString()
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
request.setValue("\(auth)", forHTTPHeaderField: "Authorization")
request.setValue("application/xml", forHTTPHeaderField: "Content-Type")
var postString = "<uploadrequest>"
postString += "<folderid>123</folderid>"
postString += "<folder_name>images</folder_name>"
postString += "<image_byte>\(data!)</image_byte>"
postString += "</uploadrequest>"
request.httpBody = postString.data(using: .utf8)
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
let task = session.uploadTask(with: request, from: imgData!, completionHandler: {
(data, response, error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
_ = self.parseJsonData(data: data)
}
})
task.resume()
}
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
print("sent:", totalBytesSent, "from:", totalBytesExpectedToSend)
let size = totalBytesSent / totalBytesExpectedToSend
self.progressbar.progress = Float(size)
}
Моя цель - загрузить изображение с помощью API и получить его прогресс загрузки.Изображение преобразуется в base64 и вставляется в <image_byte>\(data!)</image_byte>
в постстроке API.
Тогда то, что я получил, было примерно так:
отправлено: 32768 от: 927220 отправлено: 65536 от: 927220 отправлено: 131072 от: 927220 отправлено: 163840 от: 927220 отправлено:262144 от: 927220 отправлено: 294912 от: 927220 отправлено: 360448 от: 927220 отправлено: 393216 от: 927220 отправлено: 425984 от: 927220 отправлено: 491520 от: 927220 отправлено: 524288 от: 927220 отправлено: 557056 от: 927220 отправлено: 589824 от: 927220 отправлено: 622592 от: 927220 отправлено: 655360 от: 927220 отправлено: 688128 от: 927220 отправлено: 720896 от: 927220 отправлено: 786432 от: 927220 отправлено: 819200 от: 927220 отправлено: 851968 от: 927220 отправлено: 927220 от: 927220Ошибка Domain = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта, и параметр, позволяющий не устанавливать фрагменты.»UserInfo = {NSDebugDescription = JSON-текст не начинался с массива или объекта и опции, позволяющей не устанавливать фрагменты.}
Но если я использую другие методы, подобные этому (без uploadTask), он работает хорошо, нонет загрузки.
let task = URLSession.shared.dataTask(with: request, completionHandler: {
(data, response, error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
_ = self.parseJsonData(data: data)
}
})
Я тоже пробовал Alamofire
.Alamofire
с функцией request
был успешным, но все еще не дал прогресса загрузки, а Alamofire
с функцией upload
(multipartformData) выдает эту ошибку:
responseSerializationFailed (причина: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed (ошибка: Ошибка домена = NSCocoaErrorDomain Code = 3840 "Недопустимое значение для символа 3." UserInfo = {NSDebugDescription = Недопустимое значение для символа 3.}))
Я хочу знать, если я сделаюошибка в моем коде.Не могли бы вы сказать мне, что мне делать с моим кодом?Или проблема была в моем API, потому что мой API просто принимает код base64
?
Если вы хотите увидеть мой код Alamofire
, он был там
Пожалуйста, кто-нибудь, помогите мне решить эту проблему.
Спасибо!:)
РЕДАКТИРОВАТЬ 1
Это мой результат с помощью функции запроса (без функции загрузки)
{
"media_preview" = {
"image_media" = {
fileid = 4928501;
filename = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
folderpath = "product\\66861/images800\\";
height = 533;
src = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
width = 800;
};
"medium_media" = {
fileid = 4928503;
filename = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
folderpath = "product\\66861/images500\\";
height = 333;
src = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
width = 500;
};
"small_media" = {
fileid = 4928503;
filename = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
folderpath = "\product\\66861/images300\\";
height = 200;
src = "/zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
width = 300;
};
"source_media" = {
fileid = 4928499;
filename = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
folderpath = "\\product\\66861images\\";
height = 666;
src = "/zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
width = 999;
};
"thumbnail_media" = {
fileid = 4928507;
filename = "zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
folderpath = \\product\\66861/thumb\\";
height = 150;
src = "/zhzvoHBb1ogda9bps13R5IavYiadCm.jpg";
width = 150;
};
};
responsestatus = {
"access_token" = "<null>";
code = 00;
description = Success;
};
}
РЕДАКТИРОВАТЬ 2 Это код parseJsonData(data: Data)
func parseJsonData(data: Data) {
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
print(jsonResult!)
} catch {
print(error)
}
}