Всем доброго времени суток!
Очень мало толковой информации смог найти в сети, надеюсь мне кто-то что-то сможет разъяснить.
И так, есть мобильное приложение, с него нужно отправить файл на сервер, на котором его будет принимать php.
На стороне php проблем нет, а вот со стороны клиента плохо понимаю, откуда растут ноги.
Из тех обрывков информации и примеров кода смог собрать и привести в порядок следующую функцию
static String SendFilePOST(String address, String data, String FilePath) {
String result = "";
try {
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
File file = new File(FilePath);
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//Вот до сюда всё логично
String boundary = UUID.randomUUID().toString();
// Что такое boundary и зачем оно нужно? Я понимаю, что это граница, но граница чего? Данных?
//нужно ли мне это как-то особенным образом обрабатывать на стороне php?
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream request = new DataOutputStream(conn.getOutputStream());
//если boundary - это граница, то зачем мне тут ещё "--"?
request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"description\"\r\n\r\n");
request.writeBytes("Какое-то описание фала\r\n");
//на сколько я могу судить, здесь я задаю значение переменной description
//которую смогу прочитать в $_POST['description']
//Если я понимаю правильно, тогда зачем два переноса строк?
//и почему дальше я объявляю переменную file, но сразу на ней идёт filename
//а содержимое файла от его имени отделено только переносами строк?
request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n\r\n");
//добавление файла
FileInputStream fileInputStream = new FileInputStream(file);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
request.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
//конец добавления файла
request.writeBytes("\r\n");
request.writeBytes("--" + boundary + "--\r\n");
request.flush();
int respCode = conn.getResponseCode();
switch(respCode) {
case 200:
result = "ok";
break;
case 301:
case 302:
case 307:
//handle redirect - for example, re-post to the new location
break;
default:
//do something sensible
}
} catch (Exception e) {
return e.getMessage();
}
return result;
}
Все основные вопросы написал в комментариях к коду, но также есть вопрос и по получению текстового ответа от сервера, так как php по итогу принятия файла отвечает строкой в json формате.
Возможно, я выбрал не самый простой путь и можно сделать это как-то иначе, буду чрезмерно благодарен за подсказку.