2015-05-02 2 views
1

Я пытаюсь загрузить изображение на бэкэнд-клиент с помощью быстрого доступа. Проблема в том, что я не могу получить правильное форматирование для httpbody. Я не хочу использовать многостраничную форму для загрузки, поскольку я не знаю, как обращаться с ней на сервере.Загрузка изображения в swift с несколькими параметрами

Вот код, который у меня есть .. он не работает, когда я просматриваю изображение онлайн, которое он не отображает, и это всего лишь 70kb, который я знаю, определенно не так, как сильно изображение.

var bodyString: String = "session_id=\(session_id)&location_id=\(location_id)" 
bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
var body = NSMutableData.alloc() 
body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) 
if image != nil{ 
    var imageData = UIImageJPEGRepresentation(image,0.5) 
    body = NSMutableData.alloc() 
    //var imageDataString = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
    bodyString = "session_id=\(session_id)&location_id=\(location_id)&image_data=" 
    bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) 
    var imageString = "&image_data=\(imageData)" 
    body.appendData(imageData) 
    } 
req.HTTPBody = body 

UPDATE: поэтому я решил пойти по пути base64, но это все еще, кажется, не будет работать, я думаю, потому что я закодировал ее ntf8string это правильный способ делать это?

var imageData = UIImageJPEGRepresentation(image,0.5) 
var imageDataString = imageData.base64EncodedStringWithOptions(.allZeros) 
body = NSMutableData.alloc() 
bodyString = "session_id=\(session_id)&location_id=\(location_id)&tag_type=\(tag_type)&image_data=\(imageDataString)" 
bodyString = bodyString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
body.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) 

и на внутреннем интерфейсе я декодировании это нравится:

image_data_decoded = base64.b64decode(image_data) 
+0

ОК, это лучше. Несколько вещей: во-первых, не используйте 'NSMutableData.alloc()'. Это просто 'NSMutableData()'. 2. Вы должны посмотреть на 'bodyString' и убедиться, что он выглядит ОК (т. Е. Что ни одна из этих переменных не была опцией, которая в конечном итоге вставляла в вашу строку« Необязательный (...) ». 3. Возможно, вы захотите использовать что-то вроде [Charles] (http://charlesproxy.com), чтобы посмотреть на фактический запрос и убедиться, что все в порядке. Вы не поделились полной конфигурацией 'NSMutableURLRequest', поэтому мы просто не можем прокомментировать это. – Rob

+0

На сервере В PHP я бы склонен использовать ['base64_decode'] (http://php.net/manual/en/function.base64-decode), но я не знаю, что такое PHP. Я не знаком с' base64.b64decode'. .php). Независимо от того, что вы, вероятно, захотите изучить «image_data» и убедитесь, что он прошел там без помех, а затем подтвердите, что именно создалось «image_data_decoded». – Rob

ответ

0

Вы не можете добавлять двоичные данные в application/x-www-form-urlencoded запросе, как это. На самом деле код в вашем вопросе выглядит так, как будто он попытается отправить шестнадцатеричное строковое представление двоичных данных, что, вероятно, не то, что вы намеревались, и даже если вы намеревались это сделать, (а) вам придется его декодировать как-то на стороне сервера; (b) обратите внимание, что это очень неэффективно (более чем удваивает размер полезной нагрузки изображения): и (c) должен был бы быть процент, сбежавший в запросе. Но я не думаю, что вы хотели, что у всех, во всяком случае, так что, вероятно, все спорно.

Один, как правило, либо создать multipart/form-data запрос, как указано here (в котором загруженный файл поставляется в виде файла, например $_FILES в PHP), или можно было бы преобразовать эти двоичные данные в текст (например, с использованием base64) и сервер код преобразует значение base64 для image_data ключ обратно в двоичные данные.

Кстати, я мог бы предложить Alamofire или AFNetworking в качестве альтернативы попытке правильно создавать запросы. Он не меняет основной проблемы (вам нужно выбирать между кодировкой base64 или multipart-запросами), но это упрощает код Swift.

+0

Спасибо за это ... по-прежнему не может заставить его работать, используя base64 Я обновил свой вопрос с помощью текущего кода. Также будет ли это делать как multipart/form-data, чтобы быстрее его загрузить? и wo uld Я могу загрузить видео с базовым способом (не более 10 секунд), или мне нужно будет использовать многостраничную форму для видео? – Tyler

+0

Re 'multipart/form-data' будет быстрее? Я подозреваю, так потому, что ваша техника с шестнадцатеричной строкой сделала бы ее на 100% больше, и даже base64 делает на 33% больше. Используя «multipart/form-data», полезная нагрузка не увеличивается, чтобы преобразовать ее в текстовый формат (плюс код сервера проще и надежнее при обработке больших загрузок). – Rob

+0

ok получил его работу с multipart .. намного проще, когда я был на правильном пути, так что спасибо! – Tyler

Смежные вопросы