Upload video of more than 2MB. using multi part re

2019-05-18 16:11发布

I want to upload videos of more than 2Mb but i am not able to upload it.

i tried to upload with retrofit but i am getting

timeoutException

then i tried with multipart request request but i am not able to upload it.

there is no problem on server side because from IOS app we are able to upload the video which mean server configurations are correct.

here is the code that i am using to upload the video.

public int uploadFile(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 :"+imagepath);

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

            return 0;

        }
        else
        {
            try {

                JSONObject jsonObjectData = new JSONObject();
                jsonObjectData.put("api_key", "2fdaeddaeef77d488a5_5f2e");
                jsonObjectData.put("email", "example@gmail.com");
                jsonObjectData.put("access_token", "e1507300a57bf999accb593c1f04c9bdbdce5da7a9086160c4497e160da0ff74");
                jsonObjectData.put("request_token", "188d25eda1688119f2e133885a75726d2963e5f2eef4f87524b16da248544607");
                jsonObjectData.put("request_timestamp", "1459333407");

                // open a URL connection to the Servlet
                FileInputStream fileInputStream = new FileInputStream(sourceFile);
                URL url = new URL("http://admin.eyesoncrime.co.uk/api/v1/videos/upload");
                // Open a HTTP  connection to  the URL
                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("data", jsonObjectData.toString());
                conn.setRequestProperty("file_name", sourceFile.getName());

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

                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: form-data; name=\"file_upl\";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);

                // Responses from the server (code and message)
                serverResponseCode = conn.getResponseCode();
                String serverResponseMessage = conn.getContentEncoding();

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

                if(serverResponseCode == 200){

                    runOnUiThread(new Runnable() {
                        public void run() {
                            String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                                    +" C:/wamp/wamp/www/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 (Exception e) {

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

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

        } // End else block
    }

UPDATE 1:

Now I tried with OkHttp as suggested by @BNK here but getting the socket timeout exception

public class MainActivity extends AppCompatActivity {
    private final int REQUEST_TAKE_GALLERY_VIDEO = 101;
    private final Context mContext = this;
    private static final String LOG_TAG = "OkHttp";
    private TextView mTextView;
    private Handler mHandler;
    private String filemanagerstring= "";
    private static final MediaType MEDIA_TYPE_VIDEO = MediaType.parse("video/*");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.textView);
        mHandler = new Handler(Looper.getMainLooper());

    }

    public void upload(String filemanagerstring){

        JSONObject jsonObjectData = new JSONObject();
        try {
            jsonObjectData.put("api_key", "2fdaeddaeef77d488a5_5f2e");
            jsonObjectData.put("email", "neerajrathi81@gmail.com");
            jsonObjectData.put("access_token", "e1507300a57bf999accb593c1f04c9bdbdce5da7a9086160c4497e160da0ff74");
            jsonObjectData.put("request_token", "188d25eda1688119f2e133885a75726d2963e5f2eef4f87524b16da248544607");
            jsonObjectData.put("request_timestamp", "1459333407");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        File sourceFile = new File(filemanagerstring);
        OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addPart(
                        Headers.of("Content-Disposition", "form-data; file_name=\"" + sourceFile.getName() + "\"" + "\r\n"),
                        RequestBody.create(null, "Sample Text Content"))
                .addPart(
                        Headers.of("Content-Disposition", "form-data; data=\"" + jsonObjectData.toString() + "\"" + "\r\n"),
                        RequestBody.create(null, jsonObjectData.toString()))
                .addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"ECO_video.mp4\""),
                        RequestBody.create(MEDIA_TYPE_VIDEO, sourceFile))
                .build();
        final Request request = new Request.Builder()
                .url("http://admin.eyesoncrime.co.uk/api/v1/videos/upload")
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(final Request request, final IOException e) {
                Log.e(LOG_TAG, e.toString());
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(mContext, e.toString(), Toast.LENGTH_SHORT).show();
                        mTextView.setText(e.toString());
                    }
                });
            }

            @Override
            public void onResponse(Response response) throws IOException {
                final String message = response.toString();
                Log.i(LOG_TAG, message);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
                        mTextView.setText(message);
                    }
                });
            }
        });

    }
    public void openGallery(View view) {

        Intent intent = new Intent();
        intent.setType("video/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO);

    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_TAKE_GALLERY_VIDEO) {
                Uri selectedImageUri = data.getData();

                // MEDIA GALLERY
                filemanagerstring = getPath(selectedImageUri);
                upload(filemanagerstring);
            }
        }
    }

    // UPDATED!
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            // HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL
            // THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }
}

Please suggest any solution. Thanks.

0条回答
登录 后发表回答