0

我正在开发一个可以将不同文件发送到 Web 服务器的应用程序。我还想发送大文件,为了做到这一点,我需要对文件进行分块。但是当我将文件发送到服务器时,什么都没有上传。我不知道我发送文件的方式是否有错误,它在我的响应中给出错误 500(内部服务器错误)。我认为服务器不是问题,因为当我使用上传文件时multiPartEntity 它可以工作,但是当我使用 BufferedInputStream 和 DataOutputStream 时它不起作用。请帮助我并告诉我的代码有什么问题,为什么它不能发送我的文件。这是我到目前为止:

        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());
        }
4

2 回答 2

0

如果你愿意,那么你可以使用这个库。它非常易于实施和完成您需要的所有工作。

Android异步

于 2013-08-13T05:23:55.687 回答
0

您可以使用代码。它是一个 J2ME 类,用于通过 HTTP POST 多部分请求处理文件上传。

希望这可以帮助。

于 2013-08-13T04:24:45.687 回答