HttpURLConnection для отправки изображений, аудио и видео файлов с параметром может (String или Json String) Android

Я использую решение для отправки изображения, аудио или видео с параметрами, используя HttpURLConnection. Параметры могут быть (простая строка или JSON).

(Android-клиент для обратной связи с PHP)

Сценарий:      Необходимо загружать медиафайлы (аудио, видео и изображения с параметрами).

Файлы мультимедиа будут сохранены в папке сервера и параметрах на db.

У меня возникла проблема: изображение было успешно загружено, а отсутствовали параметры.

Найден потенциальное решение

Выбор HttpURLConnection вместо Httpclient как рекомендовать здесь

Вам может быть интересно, какой клиент лучше всего?

У Apache HTTP-клиента меньше ошибок на Eclair и Froyo. Это лучший выбор для этих выпусков.

Для Gingerbread и лучше, HttpURLConnection - лучший выбор. Его простой API и небольшие размеры делают его очень подходящим для Android. Прозрачное сжатие и ответное кэширование уменьшают использование сети, улучшают скорость и экономят батарею. Новые приложения должны использовать HttpURLConnection; это то, где мы будем тратить нашу энергию в будущем.

Код Android:

public int uploadFile(final String sourceFileUri) {

    String fileName = sourceFileUri;

    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    File sourceFile = new File(sourceFileUri);

    if (!sourceFile.isFile()) {

        dialog.dismiss();

        Log.e("uploadFile", "Source File not exist :" + filepath);

        runOnUiThread(new Runnable() {
            public void run() {
                messageText.setText("Source File not exist :" + filepath);
            }
        });

        return 0;

    } else {
        try {
            FileInputStream fileInputStream = new FileInputStream(sourceFile);
            URL url = new URL(upLoadServerUri);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
        //  conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("uploaded_file", fileName);


            dos = new DataOutputStream(conn.getOutputStream());


            dos.writeBytes(twoHyphens + boundary + lineEnd);

//Adding Parameter name

            String name="amir";
            dos.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd); 
            //dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            //dos.writeBytes("Content-Length: " + name.length() + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(name); // mobile_no is String variable
            dos.writeBytes(lineEnd);

            dos.writeBytes(twoHyphens + boundary + lineEnd);

//Adding Parameter phone
            String phone="9956565656";
            dos.writeBytes("Content-Disposition: form-data; name=\"phone\"" + lineEnd); 
            //dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            //dos.writeBytes("Content-Length: " + name.length() + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(phone); // mobile_no is String variable
            dos.writeBytes(lineEnd);


            //Json_Encoder encode=new Json_Encoder();
            //call to encode method and assigning response data to variable 'data'
            //String data=encode.encod_to_json();
            //response of encoded data
            //System.out.println(data);


                //Adding Parameter filepath

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            String filepath="http://192.168.1.110/echo/uploads"+fileName;

            dos.writeBytes("Content-Disposition: form-data; name=\"filepath\"" + lineEnd); 
            //dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
            //dos.writeBytes("Content-Length: " + name.length() + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(filepath); // mobile_no is String variable
            dos.writeBytes(lineEnd);


//Adding Parameter media file(audio,video and image)

            dos.writeBytes(twoHyphens + boundary + lineEnd);

            dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ fileName + "\"" + lineEnd);
            dos.writeBytes(lineEnd);
            // create a buffer of maximum size
            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);

            while (bytesRead > 0)
            {
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }

            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);


            serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();



            Log.i("uploadFile", "HTTP Response is : "+ serverResponseMessage + ": " + serverResponseCode);

            if (serverResponseCode == 200) {

                runOnUiThread(new Runnable() {
                    public void run() {
                         msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                                + "c:/wamp/www/echo/uploads";
                        messageText.setText(msg);
                        Toast.makeText(MainActivity.this,
                                "File Upload Complete.", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
            }

            // close the streams //
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {

            dialog.dismiss();
            ex.printStackTrace();

            runOnUiThread(new Runnable() {
                public void run() {
                    messageText
                            .setText("MalformedURLException Exception : check script url.");
                    Toast.makeText(MainActivity.this,
                            "MalformedURLException", Toast.LENGTH_SHORT)
                            .show();
                }
            });

            Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
        } catch (final Exception e) {

            dialog.dismiss();
            e.printStackTrace();

            runOnUiThread(new Runnable() {
                public void run() {
                    messageText.setText("Got Exception : "+e.toString());
                    Toast.makeText(MainActivity.this,
                            "Got Exception : see logcat ",
                            Toast.LENGTH_SHORT).show();
                }
            });
            Log.e("Upload file to server Exception",
                    "Exception : " + e.getMessage(), e);
        }
        dialog.dismiss();
        return serverResponseCode;
    }
}

Код Php:

$file_path = "uploads/";

//receive parameters

  $name=$_POST['name'];
  $phone=$_POST['phone'];
  $filepath=$_POST['filepath'];


   //receive media files(image , audio and video)

   $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
   if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) 
      {
      echo "Success";
      }

Надеюсь, что это поможет.

Любые запросы задают мне вопрос.

Ответ 1

Вы можете использовать Retrofit для вызова API. Минимальная поддержка Android - 2.3. Пожалуйста, проверьте детали.

Ответ 2

Вы можете сделать его более простым! Попробуйте следующее.

public static String uploadImage(Bitmap bitmap, String urlString) {
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap = Local.resize(bitmap, 512, 512);
        if(filename.toLowerCase().endsWith("jpg") || filename.toLowerCase().endsWith("jpeg"))
            bitmap.compress(Bitmap.CompressFormat.JPEG, 70, bos);
        if(filename.toLowerCase().endsWith("png"))
            bitmap.compress(Bitmap.CompressFormat.PNG, 70, bos);
        ContentBody contentPart = new ByteArrayBody(bos.toByteArray(), filename);
        ContentBody body1 = new StringBody("something");
        ContentBody body2 = new StringBody("something");
        org.apache.http.entity.mime.MultipartEntity reqEntity = new org.apache.http.entity.mime.MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("image", contentPart);
        reqEntity.addPart("sample1", body1);
        reqEntity.addPart("sample2", body2);
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setUseCaches(false);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.addRequestProperty("Content-length", reqEntity.getContentLength()+"");
        conn.addRequestProperty(reqEntity.getContentType().getName(), reqEntity.getContentType().getValue());
        OutputStream os = conn.getOutputStream();
        reqEntity.writeTo(conn.getOutputStream());
        os.close();
        conn.connect();
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            Log.d("UPLOAD", "HTTP 200 OK.");
            return readStream(conn.getInputStream());
            //This return returns the response from the upload.
        } else {
            Log.d("UPLOAD", "HTTP "+conn.getResponseCode()+" "+conn.getResponseMessage()+".");
            String stream =  readStream(conn.getInputStream());
            //Log.d("UPLOAD", "Response: "+stream);
            return stream;
        }
    } catch (Exception e) {
        Log.d("UPLOAD_ERROR", "Multipart POST Error: " + e + "(" + urlString + ")");
    }
    return null;
}