1

我尝试使用:

@Override
    protected String doInBackground(Void... params) {
        // TODO Auto-generated method stub
        String path = "http://192.168.1.112/johnson/learn/android/uploads/";
        String sUrl1 = "productSock";
        String sUrl2 = "productHistory";
        downloadFile(path, sUrl2);
        downloadFile(path, sUrl1);
        return null;
    }

    private boolean downloadFile(String path, String sUrl) {
        // TODO Auto-generated method stub
        try {
            String toUrl = path + sUrl;
            URL url = new URL(toUrl);
            URLConnection connection = url.openConnection();
            connection.connect();
            // this will be useful so that you can show a typical 0-100%
            // progress bar
            int fileLength = connection.getContentLength();

            // download the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(Environment
                    .getExternalStorageDirectory().getAbsolutePath()
                    + "/Android/data/com.android.avs.amp.inventory/files/"
                    + sUrl);

            byte data[] = new byte[1024];
            long total = 0;
            int count = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                publishProgress((int) (total * 100 / fileLength));
                output.write(data);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
        }
        return true;
    }

当上传第二个文件时它卡在 31% 有时也会卡在第一个文件上 0%

如何更改代码?或任何其他方法?

还有我的上传

@Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub
        uploadFile("productStock");
        uploadFile("productHistory");
        return false;
    }

    private void uploadFile(String path) {
        // TODO Auto-generated method stub
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String existingFileName = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/Android/data/com.android.avs.amp.inventory/files/"+path;
        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.1.112/johnson/learn/android/";
        try {
            // ------------------ CLIENT REQUEST
            FileInputStream fileInputStream = new FileInputStream(new File(
                    existingFileName));
            // open a URL connection to the Servlet
            URL url = new URL(urlString);
            // Open a HTTP connection to the URL
            conn = (HttpURLConnection) url.openConnection();
            // 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");
            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=\"uploadedfile\";filename=\""
                    + existingFileName + "\"" + 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);
            // close streams
            fileInputStream.close();
            dos.flush();
            dos.close();
        } catch (MalformedURLException ex) {
            // Log.e("Debug", "error: " + ex.getMessage(), ex);
            mErrorMsg = "error: " + ex.getMessage();
        } catch (IOException ioe) {
            // Log.e("Debug", "error: " + ioe.getMessage(), ioe);
            mErrorMsg = "error: " + ioe.getMessage();
        } 
        // ------------------ read the SERVER RESPONSE
        try {
            inStream = new DataInputStream(conn.getInputStream());
            String str;

            while ((str = inStream.readLine()) != null) {
                // Log.e("Debug", "Server Response " + str);
                mErrorMsg = "Upload Successful";
            }
            inStream.close();

        } catch (IOException ioex) {
            // Log.e("Debug", "error: " + ioex.getMessage(), ioex);
            mErrorMsg = "error: " + ioex.getMessage();
        }
    }

当要上传的文件不存在时,它会卡在进度对话框中或者有没有更好的方法来上传多个文件?

提前致谢

4

1 回答 1

1

我不确定是什么导致您的代码以一定百分比挂起,但我可以告诉您为什么它会产生损坏的数据。

在上传/下载代码中,您使用此方法写入读取字节:

stream.write(buffer, 0, bufferSize);

现在,问题在于,您为write(byte[], int, int)-method提供了错误的长度参数。

从流中读取时,read()-方法返回

返回:读入缓冲区的总字节数,如果由于到达流的末尾而没有更多数据,则返回 -1。

这意味着,即使您的byte[]数组是buffer_size字节长(例如 1024),这并不意味着读取的 1024 字节(它可能会更少,例如缓冲区可能未满)。实际读取的字节数由 - 方法返回read()

因此,您给write()-method 写入的字节数错误,这会导致它写入损坏文件的空字节。

正确的实现如下所示:

byte data[] = new byte[1024];
int read_count = 0;
while ((read_count = input.read(data, 0, data.length)) != -1) {
    output.write(data, 0, read_count);
}

如果您不上传二进制数据,通常最好使用已经缓冲的写入器实现(如BufferedWriter / BufferedReader)。


我在这篇博文中更详细地介绍了这个主题:工作无缓冲流

于 2012-08-10T09:57:00.107 回答