Загрузка данных на сервер в асинхронном режиме Android Studio

Автор: | 27.02.2017
private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {//функция формирования POST данных для отправки на сервер
      StringBuilder result = new StringBuilder();
      boolean first = true;
      for(Map.Entry<String, String> entry : params.entrySet()){
          if (first)
              first = false;
          else
              result.append("&");

          result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
          result.append("=");
          result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
      }

      return result.toString();//возвращаем сформированную строку для POST данных которые будут отправляться на сервер rateandshare.kz
  }
  //--------------------------------Загрузка изображения--------------------------------
  private class DownloadWebPageTask1 extends AsyncTask<ImageAndName, Void, String> {//загрузка изображения на сервер
      String attachmentName = "bitmap";//имя прикрепленных данных
      String attachmentFileName = "bitmap.jpg";//имя файла
      String crlf = "\r\n";//символ перехода на новую строку
      String twoHyphens = "--";//спец символы для создания POST запроса
      String boundary =  "*****";//спец символы для создания POST запроса
      @Override
      protected String doInBackground(ImageAndName... params) {
          URL url = null;

          String response = "";
          String requestURL="android.gorodmoy.com";//адрес куда мы будем отправлять POST данные для обработки
          try {
              url = new URL(requestURL);//создаем объект url из строкового типа requestURL
              //сохранение данных в из картинки в массив
              Bitmap bmp = params[0].Bmp;//Получаем изображение которое мы сфотографировали
              String Name=params[0].Name;//Получаем имя изображения которое состоит из времени когда была сделагна фотография и идентификатора телефона
              attachmentFileName=Name+".jpg";//добавляем расширение файла
              ByteArrayOutputStream stream = new ByteArrayOutputStream();//создаем объект для передачи потоковых бинарных данных. Это используется для передачи изображений
              bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);//преобразуем наше изображение из BMP формата в JPEG
              byte[] byteArray = stream.toByteArray();//Преобразуем изображение в массив байтов
              //передача данных
              HttpURLConnection httpUrlConnection = null;//объявляем объект для создания интернет соединения

              httpUrlConnection = (HttpURLConnection) url.openConnection();// открываем соединени с сайтом
              httpUrlConnection.setUseCaches(false); // запрещаем использовать кэширования.
              httpUrlConnection.setDoOutput(true);//разрешаем использование POST запросов (в нашем случае для передачи изображения)

              httpUrlConnection.setRequestMethod("POST");//устанавливаем метод передачи данных
              httpUrlConnection.setRequestProperty("Connection", "Keep-Alive");// настройка соединения для повторного использования соединений HTTP
              httpUrlConnection.setRequestProperty("Cache-Control", "no-cache");//запрет на кэширование
              httpUrlConnection.setRequestProperty(
                      "Content-Type", "multipart/form-data;boundary=" + this.boundary);//настройка POST данных для передачи данных частями. Используется при передачи больших объемов данных.

              DataOutputStream request = new DataOutputStream(
                      httpUrlConnection.getOutputStream());//создаем объект для передачи данных

              request.writeBytes(this.twoHyphens + this.boundary + this.crlf);//начинаем запись POST данных по стандарту. Формируем POST запрос
              request.writeBytes("Content-Disposition: form-data; name=\"" +
                      this.attachmentName + "\";filename=\"" +
                      this.attachmentFileName + "\"" + this.crlf);
              request.writeBytes(this.crlf);
              request.write(byteArray);
              request.writeBytes(this.crlf);
              request.writeBytes(this.twoHyphens + this.boundary +
                      this.twoHyphens + this.crlf);
              request.flush();
              request.close();//закрываем запрос
              InputStream responseStream = new
                      BufferedInputStream(httpUrlConnection.getInputStream());//получаем ответ от сервера

              BufferedReader responseStreamReader =
                      new BufferedReader(new InputStreamReader(responseStream));

              String line = "";
              StringBuilder stringBuilder = new StringBuilder();

              while ((line = responseStreamReader.readLine()) != null) {//читаем данные с сервера
                  stringBuilder.append(line).append("\n");
              }
              responseStreamReader.close();

              response = stringBuilder.toString();
              responseStream.close();
              httpUrlConnection.disconnect();

          } catch (Exception e) {
              Toast toast = Toast.makeText(getApplicationContext(),// если произошли ошибки при передаче данных то мы выводим сообщение об ошибке
                      "Произошла ошибка при загрузке отзыва на сайт. Попробуйте еще раз!", Toast.LENGTH_LONG);
              toast.show();
              e.printStackTrace();
          }

          return response;//возвращаем ответ сервера.
      }


      @Override
      protected void onPostExecute(String result) {//обрабатываем ответ сервера при успешной загрузке данных

          Toast toast = Toast.makeText(getApplicationContext(),// если произошли ошибки при передаче данных то мы выводим сообщение об ошибке
                  "Спасибо вам за отзыв. Ваш отзыв успешно загружен на сайт rateandshare.kz!", Toast.LENGTH_LONG);
          toast.show();


      }
  }
  //--------------------------------Загрузка описания и кода--------------------------------
  private class ImageAndName // Создаем свой класс в котором будет находиться имя картинки и сама картинка. Это необходимо для того чтобы передать данные на сервер в одном объекте
  {
      String Name;
      Bitmap Bmp;

  }
  private class DownloadWebPageTask extends AsyncTask<String, Void, String> {//класс для передачи данных на сервер в асинхронном режиме.
      @Override
      protected String doInBackground(String... params) {//выполнение фонового асинхронного задания. В нашем случае используется для передачи данных на сервер
          URL url = null;//создаем объект в котором будет храниться адрес страницы на которую мы будем отправлять POST данные

          String response = "";//Переменная для хранения ответа сервера
          String requestURL=params[0];//Адрес в интернет на который мы будем передвать пост данные
          try {
              url = new URL(requestURL);//Создаем объект адреса в интернет

              HttpURLConnection conn = (HttpURLConnection) url.openConnection();//открываем соединение с веб страницей
              conn.setReadTimeout(15000);//устанавливаем таймаут ответа сервера в процессе чтения страницы на 15 секунд
              conn.setConnectTimeout(15000);//Устанавливаем таймаут времени соединения с сервером на 15 секунд
              conn.setRequestMethod("POST");//Задаем метод передачи данных POST
              conn.setDoInput(true);//Разрешаем передачу данных на сервер
              conn.setDoOutput(true);//Разрешаем прием данных с сервера


              OutputStream os = conn.getOutputStream();//Объявляем объет для передачи данных на сервер
              BufferedWriter writer = new BufferedWriter(//инициализируем объект для записи данных на сервер
                      new OutputStreamWriter(os, "UTF-8"));
              HashMap<String, String> postDataParams;//Объявляем объект для хранения передаваемых данных
              postDataParams=new HashMap<String, String>();//инициализируем объект для хранения передаваемых данных

              //Add Key/Value pairs
              postDataParams.put("name", params[1]);//Задаем значения POST данных
              postDataParams.put("imei", params[2]);


              writer.write(getPostDataString(postDataParams));//Передаем данные на сервер

              writer.flush();//Сохранить данные из кэша
              writer.close();//завершить передачу данных на свервер
              os.close();//Завершить соединение с сервером
              int responseCode=conn.getResponseCode();//получить код отвечающий за результат соединения

              if (responseCode == HttpsURLConnection.HTTP_OK) {//если все прошло успешно
                  String line;//переменная в которой будем записывать ответ сервера
                  BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));//создаем объект чтения данных с сервера
                  while ((line=br.readLine()) != null) {//читаем пока есть данные
                      response+=line;
                  }
              }
              else {
                  response="";// в случае ошибки отвер пустой.

              }
          } catch (Exception e) {
              e.printStackTrace();//стандартный обработчик исключений
          }

          return response;//возвращаем ответ сервера
      }


      @Override
      protected void onPostExecute(String result) {

          //productDescription.setText(result);
      }
  }

  public void downloadWebpage() {

      //--------Загрузка текстовых данных--------------
      TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);//создаем объект для получения imei кода который будем использовать как идентификатор пользователя
      String imei = telephonyManager.getDeviceId();//получаем imei код

      String S1;//объявляем переменные в которых будем хранить параметры передаваемые на сервер
      S1="Алексей Каверин";
      try {

          S1 = URLEncoder.encode(S1, "UTF-8");//кодируем данные для передачи на сервер

      } catch (Exception e) {
          // произошла ошибка.
          Toast toast = Toast.makeText(getApplicationContext(),// если произошли ошибки при передаче данных то мы выводим сообщение об ошибке
                  "Возникла ошибка при передаче данных на сервер. Проверьте подключение к интернет и повторите отправку.", Toast.LENGTH_LONG);
          toast.show();
      }



      DownloadWebPageTask task = new DownloadWebPageTask();//создаем объект для загрузки данных на сервер


      task.execute(new String[]{"http://android.gorodmoy.com", S1, imei});//запускаем загружку данных на сервер

      //---------------Загрузка изображения
    //  DownloadWebPageTask1 task1 = new DownloadWebPageTask1();//создаем объект для загурзки изображения на сервер
     // ImageAndName IMN = new ImageAndName();//создаем объект в котором будем хранить фото и имя файла
      //IMN.Bmp = myphoto;//записываем фото
  //    IMN.Name = S5;//записываем имя файла
    //  task1.execute(IMN);//запускаем передачу данныха на сервер.




  }
  //--------------------------------------------------------------------------------------------------------- загрузка производителя ссервера