Why it returns Internal Server Error on httpUrlCon

2019-08-24 03:00发布

I'm developing an application that can send different files to web server.Also I want to send large files, in able to do this I need to chunk the files. But when I'm sending the files to server nothing is uploaded. I don't know if there's error on how I'm sending the files and it gives an error 500 (internal server error) on my response.I don't think the server is the problem because when I'm uploading a file using multiPartEntity it works but when Im using BufferedInputStream and DataOutputStream it doesn't work. Please help me and tell what's wrong on my code why it can't send my files. Here's I got so far:

        String samplefile = "storage/sdcard0/Pictures/Images/picture.jpg";
        File mFile = new File(samplefile);

        int mychunkSize = 2048 * 1024;
        final long size = mFile.length();
        final long chunks = size < mychunkSize? 1: (mFile.length() / mychunkSize);

        int chunkId = 0;
        try {

            BufferedInputStream stream = new BufferedInputStream(new FileInputStream(mFile));

            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary =  "-------------------------acebdf13572468";// random data

            for (chunkId = 0; chunkId < chunks; chunkId++) {

                 URL url = new URL(urlString);

                 // Open a HTTP connection to the URL
                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                 conn.setReadTimeout(20000 /* milliseconds */);
                 conn.setConnectTimeout(20000 /* milliseconds */);


                 // Allow Inputs
                 conn.setDoInput(true);
                 // Allow Outputs
                 conn.setDoOutput(true);
                 // Don't use a cached copy.
                 conn.setUseCaches(false);
                 // Use a post method.
                 conn.setRequestMethod("POST");

                 String encoded = Base64.encodeToString((_username+":"+_password).getBytes(),Base64.NO_WRAP); 
                 conn.setRequestProperty("Authorization", "Basic "+encoded); 
                 conn.setRequestProperty("Connection", "Keep-Alive");

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

                 String param1 = ""+chunkId;
                 String param2 = ""+chunks;
                 String param3 = mFile.getName();
                 String param4 = samplefile;

              // Send parameter #file
                dos.writeBytes("Content-Disposition: form-data; name=\"fieldNameHere\";filename=\"" + param3 + "\"" + lineEnd); // filename is the Name of the File to be uploaded
                dos.writeBytes("Content-Type: image/jpeg" + lineEnd);
                dos.writeBytes(lineEnd);



                // Send parameter #chunks
                dos.writeBytes("Content-Disposition: form-data; name=\"chunk\"" + lineEnd);
                dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
                dos.writeBytes("Content-Length: " + param2.length() + lineEnd);
                dos.writeBytes(lineEnd);
                dos.writeBytes(param2 + lineEnd);
                dos.writeBytes(twoHyphens + boundary + lineEnd);


                // Send parameter #name
                dos.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd);
                dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
                dos.writeBytes("Content-Length: " + param3.length() + lineEnd);
                dos.writeBytes(lineEnd);
                dos.writeBytes(param3 + lineEnd);
                dos.writeBytes(twoHyphens + boundary + lineEnd);


                byte[] buffer = new byte[mychunkSize];

                stream.read(buffer);

                dos.write(buffer);

                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                dos.flush();
                dos.close();


            }
        } catch (Exception e) {
            Log.e("Error Uploading Files", e.toString());
        }

2条回答
做自己的国王
2楼-- · 2019-08-24 03:30

If you prefer then you can use this library. Its very easy to implement and dose all the work you need.

AndroidAsync

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-08-24 03:49

You can make use of this code. It is a J2ME class to handle file uploads via HTTP POST Multipart Requests.

Hope this helps.

查看更多
登录 后发表回答