Я пытаюсь отправить изображение (как часть формы) на сервер PHP из приложения Worklight V6 с помощью адаптера HTTP. Изображение закодировано в base64
navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 8, destinationType: navigator.camera.DestinationType.DATA_URL });
.. позже в коде
$('#myImageImg').attr('src', "data:image/jpeg;base64," + imageData);
Я отправляю изображение на адаптер
var img = $('#myImageImg').attr('src'); var formData = {"someField" : name, "image" : img }; var invocationData = { adapter : 'emailAdapter', procedure : 'sendEmail', parameters : [ formData ] }; var options = { onSuccess : sendEmailOK, onFailure : sendEmailFail, invocationContext : {} }; $.mobile.showPageLoadingMsg(); WL.Client.invokeProcedure(invocationData,options);
В моем адаптере HTTP я uriencode данные формы и отправить его x-www-form-urlencoded
function sendEmail(inputData) { var uri = 'myStuff/sendEmail.php'; var imageData="image='" + inputData.image+"'"; var formData = encodeURI(imageData); var input = { method : 'post', returnedContentType : 'html', path : path, body: { "contentType" : "application/x-www-form-urlencoded", 'content' : formData }
Когда я дешифрую данные и сохраняю их в файле с помощью моего php-сервера, средство просмотра фотографий Windows отображает сообщение об ошибке «Средство просмотра фотографий Windows не может открыть это изображение, потому что файл выглядит поврежденным, поврежденным или слишком большим».
Я новичок php, но вот PHP-код, который я использовал
<?php $image = $_POST['image'] $decoded=base64_decode($image); file_put_contents('C:\apache\htdocs\myStuff\newImage.JPG',$decoded);
Я уверен, что я делаю какую-то глупую ошибку начинающего, но я не уверен, что это код моего адаптера, php-код или код моего клиентского кода. Заранее благодарю вас за любые предложения.
JT
Я думаю, что проблема заключается в «данных: image / jpeg; base64», в начале кодированных данных base64. Либо отправьте изображение на адаптер без префикса, либо отключите его в адаптере перед отправкой в службу.
Дэвид Д спас меня. В коде адаптера я
var formData = encodeURI(imageData);
Чтобы заставить код работать, мы изменили его на
var imageData = "image='" + encodeURIComponent(inputData.image)+"'";
var input = {метод: 'post', returnContentType: 'html', путь: путь,
body: {"contentType": "application / x-www-form-urlencoded",
'content' : imageData }
Мысль здесь состоит в том, что строки, закодированные в base64, могут иметь 1 или 2 трейлинг =, чтобы выровнять четное число. encodeURI не кодирует =, так что они терялись при переводе с адаптера на мой PHP-сервер.
Кроме того, как писал Дейв выше, мне нужно было вырезать «data: image / jpeg; base64» в начале кодированных данных base64. Спасибо, Дэвид !!!