У меня есть кросс-платформенное приложение, созданное с использованием пользовательского интерфейса Monaca / Onsen и AngularJS.
Приложение позволяет пользователям делать снимки (фотографии), и это работает как задумано.
Далее я хочу загрузить изображения на свой сервер для хранения и дальнейшего использования.
У меня есть захват изображения приложения, работающий по назначению, и я реализовал решение PHP на сервере, который появляется работать, но я не могу видеть изображения.
Код моего приложения для захвата и загрузки выглядит следующим образом (на данный момент я просто получаю доступ к библиотеке изображений и выбираю изображения для тестирования, а не их захвата, но оба решения работают):
$scope.takePicture = function getImage() {
navigator.camera.getPicture(uploadPhoto, function (message) {
alert('get picture failed');
}, {
quality: 100, 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);
options.mimeType = "image/jpeg";
var params = new Object();
params.value1 = "test";
params.value2 = "param";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(imageURI, "http://mysite/public/api/savephotos.php", function (result) {
alert("Success: " + JSON.stringify(result)); // Success: {"bytesSent":42468,"responseCode":200,"response":"","objectId":""}
}, function (error) {
alert("Fail: " + JSON.stringify(error));
}, options);
}
От успех В ответ кажется, что изображения отправляются, но когда я проверяю папку, где изображения должны быть сохранены (C: \ XAMPP \ HTDOCS \ Public \ апи \ загрузки), папка пуста. Детали на стороне сервера — это шаблон Sximo с использованием инфраструктуры Laravel, размещенной на AWS.
Код PHP, который обрабатывает сохранение на стороне сервера, выглядит следующим образом:
<?php
// Connect to Database
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '';
$DB_NAME = 'myDB';
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// Allow Headers
header('Access-Control-Allow-Origin: *');
$new_image_name = urldecode($_FILES["file"]["name"]).".jpg";
// Move files into upload folder
move_uploaded_file($_FILES["file"]["tmp_name"], 'C:\xampp\htdocs\public\api\upload'.$new_image_name);
mysqli_close($mysqli);
Тем не менее C: \ XAMPP \ HTDOCS \ Public \ апи \ загрузки пусто — изображения не отправляются. У меня есть файл с именем загрузить изображение это было отправлено в каталог * C: \ xampp \ htdocs \ public \ api *, который обновляется с каждым тестом — но это пустой (0 КБ) файл.
Куда я иду с этим не так?
Это asynktask, который я использую для отправки изображения из приложения галереи на сервер
public static class requestPostReportPhoto extends AsyncTask<String, Void, String> {
Bitmap image;
String JSON_STRING;
@Override
protected void onPreExecute(){
String fileUrl = Environment.getExternalStorageDirectory()+"/"+Environment.DIRECTORY_DCIM+"/"+"albumName"+"/"+"photoName";
image = BitmapFactory.decodeFile(fileUrl);
}
@Override
protected String doInBackground(String... params) {
String fileUrl = Environment.getExternalStorageDirectory()+"/"+Environment.DIRECTORY_DCIM+"/"+"albumName"+"/"+"photoName";
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
HttpURLConnection connection = null;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
String response = "Error";String urlString = "yourUrlServer";
try {
File file = new File(fileUrl);
FileInputStream fileInputStream = new FileInputStream(file);
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true); // Allow Inputs
connection.setDoOutput(true); // Allow Outputs
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.addRequestProperty("content-type", "multipart/form-data; boundary=" + boundary);dos = new DataOutputStream(connection.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + "PHOTONAME" + "\"" + lineEnd);
dos.writeBytes(lineEnd);Log.d("MediaPlayer", "Headers are written");
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
StringBuilder responseSB = new StringBuilder();
int result = connection.getResponseCode();
BufferedReader br;
// 401 - 422 - 403 - 404 - 500
if (result == 401 || result == 422 || result == 403 || result == 404 || result == 500)
{
br = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
}
else {
br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
}
while ( (JSON_STRING = br.readLine()) != null)
responseSB.append(JSON_STRING+ "\n");
Log.d("MediaPlayer","File is written");
fileInputStream.close();
dos.flush();
dos.close();
br.close();response = responseSB.toString().trim();
} catch (IOException ioe) {
Log.d("MediaPlayer", "error: " + ioe.getMessage(), ioe);
}
return response;
}@Override
protected void onPostExecute(String result) {
Log.d("SERVER RESPONSE ->",result)
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
Других решений пока нет …