Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Android Новый топик    Ответить
 Передача файла на HTTP через POST  [new]
Slon747
Member

Откуда:
Сообщений: 402
Передаю на http параметры через POST.
А как передать файл, чтобы на сервере его получить в $_FILES ?
В инете есть примеры, но требуют импорта библиотек.
Вот мой пример. Как можно его доработать с учетом передачи файла?

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param1", "value1"));
params.add(new BasicNameValuePair("param2", "value2"));
 
JSONParser jParser = new JSONParser();
// посылаем запрос методом POST
String json = jParser.makeHttpRequest("http://my_domain.com/script.php", "POST", params);
JSONObject result = jParser.getParingJSON_Object(json);


class JSONParser {
 
    private static InputStream is = null;
    private static String json = "";
 
    // конструктор
    public JSONParser() {
 
    }
 
    // =========================================================
    // Получение ответа от сервера в формате String
    // =========================================================
 
    /**
     * Получить ответ по ссылке в формате json
     *
     * @param url    запрашиваемая страница
     * @param method GET or POST
     * @param params параметры, которые необходимо передать
     */
    public String makeHttpRequest(String url, String method, List<NameValuePair> params) {
 
        // создаём HTTP запрос
        try {
 
            if (method.equals("POST")) {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));
 
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                if (httpEntity != null)
                    is = httpEntity.getContent();
 
            } else if (method.equals("GET")) {
 
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "UTF-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
 
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = null;
                if (httpResponse != null)
                    httpEntity = httpResponse.getEntity();
                if (httpEntity != null)
                    is = httpEntity.getContent();
            }
 
        } catch (UnsupportedEncodingException e) {
            // обработка ошибки
        } catch (ClientProtocolException e) {
            // обработка ошибки
        } catch (IOException e) {
            // обработка ошибки
        }
 
        if (is != null) {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                json = sb.toString();
                if (is != null)
                    is.close();
            } catch (Exception e) {
            // обработка ошибки
            }
        }
 
        return json;
    }
 
    // =========================================================
    // Парсинг ответа от сервера из String в JSONObject
    // =========================================================
    public JSONObject getParingJSON_Object(String json) {
 
        JSONObject result = null;
 
        try {
            result = new JSONObject(json);
        } catch (JSONException e) {
            // обработка ошибки
        }
 
        return result;
    }
25 авг 17, 15:20    [20749634]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24312
Я верно понял: хочешь передать файл в json, но так, чтобы он был доступен в php как обычный бинарник?
25 авг 17, 18:01    [20750115]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
Slon747
Member

Откуда:
Сообщений: 402
wadman,

Я не json передаю.
В json я получаю ответ от сервера.
Но это не главное. Мне бы на сервер передать как положено.
25 авг 17, 21:12    [20750445]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1437
Slon747,

Вообще в инете куча примеров как передать файл по http
1.Во первых они базируються на AsyncTask
2.Во вторых без ProggresbarА оно вообще не должно делаться
+

private  class UploadFile extends AsyncTask<String, Integer, String> {
        URL connectURL;
        String responseString="";
        String Title;
        String Description="";
        byte[] dataToServer;
        FileInputStream fileInputStream = null;
        private PowerManager.WakeLock mWakeLock;
        private Context context;
        UploadFile(Context context){
            this.context=context;

        }
        @Override
        protected String doInBackground(String... urls) {
            HttpURLConnection conn = null;
            DataOutputStream dos = null;
            DataInputStream inStream = null;
            // String existingFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Bluetooth/my.txt";
            String existingFileName = "/sdcard/inventar.db";
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1 * 1024 * 1024;
            String responseFromServer = "";
          //  String urlString = "http://192.168.0.101:8079/upload";
            String urlString = urls[0];
            String filename = urls[1];

            try {
                File file=new File(existingFileName);
                long fileLength= file.length();

                FileInputStream fileInputStream = new FileInputStream(file);

                URL url = new URL(urlString);

                conn = (HttpURLConnection) url.openConnection();

                conn.setDoInput(true);

                conn.setDoOutput(true);

                conn.setUseCaches(false);

                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                dos = new DataOutputStream(conn.getOutputStream());
                dos.writeBytes(twoHyphens + boundary + lineEnd);

                dos.writeBytes("Content-Disposition: form-data; name=\"description\"" + lineEnd);
                dos.writeBytes(lineEnd);
                dos.writeBytes(Description);
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + lineEnd);
               //  String filestr="inventarsaveyyy.db";
                String filestr=filename;
                dos.writeBytes("Content-Disposition: form-data; name=\"fileName\"; filename=\"" + filestr /*existingFileName*/ + "\"" + lineEnd);
                dos.writeBytes(lineEnd);


                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];
                // read file and write it into form...
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                int total=0;

                while (bytesRead > 0) {

                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                    total=total+bytesAvailable;
                    publishProgress((int) (total * 100 / fileLength));

                }

                // send multipart form data necesssary after file data...
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                // close streams
                Log.e("Debug", "File is written");
                fileInputStream.close();
                dos.flush();
                dos.close();
                // Toast.makeText(context,"File upload", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                //  Toast.makeText(context,e.getMessage()+"error", Toast.LENGTH_SHORT).show();
                //return   "Ошибка "+e.getMessage();
            }

            //------------------ read the SERVER RESPONSE
            try {

                inStream = new DataInputStream(conn.getInputStream());
                String str;

                while ((str = inStream.readLine()) != null) {
                    System.out.println(str);
                    responseString=responseString+str+"\r\n";
                    // Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
                }

                inStream.close();

            } catch (Exception ioex) {

                //        Toast.makeText(context, ioex.getMessage() + "error", Toast.LENGTH_SHORT).show();
                return   "Ошибка "+ioex.getMessage();
            }
            return null;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // take CPU lock to prevent CPU from going off if the user
            // presses the power button during download
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    getClass().getName());
            mWakeLock.acquire();
            mProgressDialog.show();
        }
        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            // if we get here, length is known, now set indeterminate to false
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            mWakeLock.release();
            mProgressDialog.dismiss();
            if (result != null)
                Toast.makeText(context,"Ошибка загрузки: "+result, Toast.LENGTH_LONG).show();
            else {
                Toast.makeText(context, "File Загружен " + responseString, Toast.LENGTH_SHORT).show();
                try {
                    WorkDB.update_scn();
                    Toast.makeText(context, " SCN обновлён ", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(context, " Проблема при обновлении SCN ", Toast.LENGTH_SHORT).show();
                }
            }
        }




Пуск во такой
prepareprogressdialog();
        final UploadFile uploadFile=new UploadFile(LoadUpload.this);

Где

void prepareprogressdialog() {
        mProgressDialog = new ProgressDialog(LoadUpload.this);
        mProgressDialog.setMessage("Загружаю...");
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);


    }
26 авг 17, 09:32    [20750766]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
Slon747
Member

Откуда:
Сообщений: 402
irbis_al,

Да, я в асинхронном и делаю.
Спасибо за пример. Буду пробовать.
26 авг 17, 10:31    [20750810]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1437
Slon747,

Запуск недокопировался
 prepareprogressdialog();
        final UploadFile uploadFile=new UploadFile(LoadUpload.this);
//Получаю имена фалов и urlов из настроек.
        String url=MainActivity.getShp().getString("upload","http://10.0.3.1:8079/upload");
        String filename="inventarsave.db";
        String filestr=MainActivity.getShp().getString("file",filename);
//Сам пуск
        uploadFile.execute(url,filestr);
//Отмена загрузки
        mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                uploadFile.cancel(true);
});
26 авг 17, 10:49    [20750840]     Ответить | Цитировать Сообщить модератору
 Re: Передача файла на HTTP через POST  [new]
Slon747
Member

Откуда:
Сообщений: 402
irbis_al,

Большое спасибо!
Всё работает.
28 авг 17, 13:48    [20753593]     Ответить | Цитировать Сообщить модератору
Все форумы / Android Ответить