Возникла проблема по передаче изображения на сервер. Данный код написан для Android
и работает только с версией 4.1
и ниже. При использовании в других версиях ловит ProtocolException
.
Разрешение на доступ к файлам есть.
public class FilesUploadingTask extends AsyncTask<Void, Void, String> {
private ProgressDialog WaitingDialog;
private String lineEnd = "\r\n";
private String twoHyphens = "--";
private String boundary = "Asrf456BGe4h";
// Переменные для считывания файла в оперативную память
private int bytesRead, bytesAvailable, bufferSize;
private byte[] buffer;
private int maxBufferSize = 1*1024*1024;
private String filePath, fullSize;
// Адрес метода api для загрузки файла на сервер
public static final String API_FILES_UPLOADING_PATH = "адрес пути отправки запроса";
// Ключ, под которым файл передается на сервер
public static final String FORM_FILE_NAME = "file";
@Override
protected void onPreExecute() {
WaitingDialog = ProgressDialog.show(context, "Отправка данных",
"Отправляем изображение... \n Это может занять продолжительное время", true);
super.onPreExecute();
}
public FilesUploadingTask(String filePath, String fullSize) {
this.filePath = filePath;
this.fullSize = fullSize;
}
@Override
protected String doInBackground(Void... params) {
// Результат выполнения запроса, полученный от сервера
String result = "null";
try {
// Создание ссылки для отправки файла
URL uploadUrl = new URL(API_FILES_UPLOADING_PATH);
// Создание соединения для отправки файла
HttpURLConnection conn = (HttpURLConnection) uploadUrl.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Host", "www.spamu.net");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
conn.setRequestProperty("Content-Length", "" + fullSize);
DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
// Начало контента
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(sName + lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"contact\"" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(sPhone + lineEnd);
// Формирование multipart контента
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
// Заголовок элемента формы
outputStream.writeBytes("Content-Disposition: form-data; name=\"" +
FORM_FILE_NAME + "\"; filename=\"" + filePath + "\"" + lineEnd);
// Тип данных элемента формы
outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd);
// Конец заголовка
outputStream.writeBytes(lineEnd);
// Поток для считывания файла в оперативную память
FileInputStream fileInputStream = new FileInputStream(new File(filePath));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Считывание файла в оперативную память и запись его в соединение
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// Конец элемента формы
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
int serverResponseCode = conn.getResponseCode();
fileInputStream.close();
outputStream.flush();
outputStream.close();
if(serverResponseCode == 200) {
result = readStream(conn.getInputStream());
} else {
result = readStream(conn.getErrorStream());
}
//Log.d("classInJson", "result > " + result);
return result;
} catch (MalformedURLException e) {
Log.d("classInJson", "Ошибка соединения с сервером > " + result);
WaitingDialog.dismiss();
e.printStackTrace();
return "MailformedURLe";
} catch (ProtocolException e) {
Log.d("classInJson", "Несовпадение протоколов передачи данных > " + result);
WaitingDialog.dismiss();
e.printStackTrace();
return "Protocole";
} catch (FileNotFoundException e) {
Log.d("classInJson", "Файл не найден > " + result);
WaitingDialog.dismiss();
e.printStackTrace();
return "NoFilee";
} catch (IOException e) {
Log.d("classInJson", "Ошибка передачи данных > " + result);
WaitingDialog.dismiss();
e.printStackTrace();
return "IOe";
}
}
public String readStream(InputStream inputStream) throws IOException {
StringBuffer buffer = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
return buffer.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
JSONObject dataJsonObj = null;
switch (result) {
case"MailformedURLe":
Toast.makeText(context, "Ошибка соединения с сервером", Toast.LENGTH_LONG).show();
break;
case "Protocole":
Toast.makeText(context, "Несовпадение протоколов передачи данных", Toast.LENGTH_LONG).show();
break;
case "NoFilee":
Toast.makeText(context, "Файл для передачи не найден", Toast.LENGTH_LONG).show();
break;
case "IOe":
Toast.makeText(context, "Ошибка передачи", Toast.LENGTH_LONG).show();
break;
}
try {
dataJsonObj = new JSONObject(result);
JSONObject resultdata = dataJsonObj.getJSONObject("data");
} catch (JSONException e) {
e.printStackTrace();
}
WaitingDialog.dismiss();
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени сутокПишу автотест, компилил его нормально через команду mvn test, но через время в командной строке стала появлятся ошибка...
Есть несколько паттернов, которые я объединяю через join("|")
мне нужно придумать алгоритм, который будет формировать плейлист из треков длительностью 1 частреки находятся в 2 разных папках