1

我需要使用 POST 或其他选项将 zip 文件上传到 URL。我按照以下方法成功上传了文件。

String diskFilePath="/tmp/test.zip;
    String urlStr="https://<ip>/nfc/file.zip";

    HttpsURLConnection conn = (HttpsURLConnection) new URL(urlStr).openConnection();
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setChunkedStreamingMode(CHUCK_LEN);
    conn.setRequestMethod(put? "PUT" : "POST"); // Use a post method to write the file.
    conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("Content-Length", Long.toString(new File(diskFilePath).length()));

    int i=0;
    while(i<1)
    {
        continue;
    }

    BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream());

    BufferedInputStream diskis = new BufferedInputStream(new FileInputStream(diskFilePath));
    int bytesAvailable = diskis.available();
    int bufferSize = Math.min(bytesAvailable, CHUCK_LEN);
    byte[] buffer = new byte[bufferSize];

    long totalBytesWritten = 0;
    while (true) 
    {
        int bytesRead = diskis.read(buffer, 0, bufferSize);
        if (bytesRead == -1) 
        {
            //System.out.println("Total bytes written: " + totalBytesWritten);
            break;
        }

        totalBytesWritten += bytesRead;
        bos.write(buffer, 0, bufferSize);
        bos.flush();
    //  System.out.println("Total bytes written: " + totalBytesWritten);
        int progressPercent = (int) (((bytesAlreadyWritten + totalBytesWritten) * 100) / totalBytes);

    }

现在我的 zip 文件位于远程位置,我需要上传 zip 文件而不下载到本地机器。

我需要传递这个网址“https:///file/test.zip”而不是“/tmp/test.zip”</p>

例如,我在机器 A 上执行程序,要上传的文件存在于机器 B 中。Webserver 部署在机器 B 中,并暴露 url 以下载 zip 文件。现在我需要传递这个 ZIP 文件 URL 位置来上传,而不是将 zip 文件下载到机器 A,然后传递到上传 URL。

谢谢, 卡莱

4

1 回答 1

2

不是 100% 你所说的“不下载到本地机器”。

这是避免将文件下载到临时本地文件然后上传的方法。基本方法是从一个 URLConnection (而不是本地文件)读取并写入另一个 URLConnection (就像你已经做的那样)。首先向 发出请求sourceString,所以

HttpsURLConnection source = (HttpsURLConnection) new URL("https://machine.B/path/to/file.zip").openConnection();

然后保留所有内容,直到您设置Content-Length并替换为

conn.setRequestProperty("Content-Length", source.getContentLength());

然后你所要做的就是使用

InputStream is = source.getInputStream();

而不是你的diskis.

PS:我不明白.available逻辑的目的,为什么不使用 CHUNK_LEN 作为缓冲区大小?PPS:也while(i<0)可以删除循环;-)

于 2013-10-22T11:57:04.287 回答