Как загрузить файл с помощью Phonegap и JqueryMobile?
Я создаю мобильное приложение для Android с JQM и PhoneGap.
Мне нужно загрузить файл (изображение) на удаленный сервер (из галереи или сфотографироваться с камерой).
В принципе, это можно сделать с помощью API файлов phonegap, проблема в том, что сервер был написан для поддержки простой отправки POST.
Мне нужно, чтобы "имитировать" в моем приложении запрос точный, поскольку он был отправлен из следующей формы html.
Кроме того, мне нужно получить ответ сервера.
<form name="myWebForm" ENCTYPE="multipart/form-data" action="http://www.myurl.com/api/uploadImage "method="post">
<input type="file" name="image" />
<input type="submit" value="Submit"/>
</form>
Я попытался использовать API файлов phonegap, но структура полученных данных на стороне сервера отличается от того, что должно быть.
Я попытался реализовать эту форму в своем приложении, но кнопка "выбрать файл" была отключена...
Как это можно сделать без каких-либо изменений на стороне сервера?
Ответы
Ответ 1
Вы не можете использовать входной файл в Phonegap. Это не поддерживается. Вам нужно сделать что-то вроде этого:
function onDeviceReady() {
// Retrieve image file location from specified source
navigator.camera.getPicture(uploadPhoto,
function(message) { alert('get picture failed'); },
{ quality: 50,
destinationType: navigator.camera.DestinationType.FILE_URI,
sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY }
);
}
function uploadPhoto(imageURI) {
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1)+'.png';
options.mimeType="text/plain";
var params = new Object();
options.params = params;
var ft = new FileTransfer();
ft.upload(imageURI, encodeURI("http://some.server.com/upload.php"), win, fail, options);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
console.log("upload error source " + error.source);
console.log("upload error target " + error.target);
}
В методе getPicture вы выберете источник файлов. Дополнительная информация: http://docs.phonegap.com/en/2.1.0/cordova_file_file.md.html#FileTransfer
EDIT:
Необходимо указать расширение fileName, а также указать mimeType в формате "text/plain" для отправки изображения в текстовом формате.
Что касается параметров, если они вам не нужны, зачем их использовать?
Ответ 2
Вы не можете использовать входной файл в Phonegap. Это не поддерживается. Вам нужно сделать что-то вроде этого:
<div ng-click="selectPicture()">selectPicture</div> // Put own HTML format but call the fuction
// Angular fuction
$scope.selectPicture = function () {
var srcType = Camera.PictureSourceType.SAVEDPHOTOALBUM;
var options = {
// Some common settings are 20, 50, and 100
quality: 50,
destinationType: Camera.DestinationType.FILE_URI,
// In this app, dynamically set the picture source, Camera or photo gallery
sourceType: srcType,
encodingType: Camera.EncodingType.JPEG,
mediaType: Camera.MediaType.PICTURE,
allowEdit: true,
correctOrientation: true //Corrects Android orientation quirks
}
navigator.camera.getPicture(function cameraSuccess(imageUri) {
MobileUploadFile(imageUri);
}, function cameraError(error) {
console.debug("Unable to obtain picture: " + error, "app");
}, options);
}
function MobileUploadFile(imageURI) {
//console.log(imageURI);
var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1);
options.mimeType="image/jpeg";
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(imageURI, encodeURI("http://www.example.com/upload.php"), function(result){
//console.log(JSON.stringify(result));
}, function(error){
//console.log(JSON.stringify(error));
}, options);
};
// php file
<?php
// Directory where uploaded images are saved
$dirname = "uploads/";
// If uploading file
if ($_FILES) {
print_r($_FILES);
mkdir ($dirname, 0777, true);
move_uploaded_file($_FILES["file"]{"tmp_name"],$dirname."/".$_FILES["file"]["name"]);
}
?>