我需要使用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”
例如,我在机器A上执行程序,并且要上载的文件存在于机器B中.Webserver部署在机器B中,并且url暴露下载zip文件。现在我需要将此ZIP文件URL位置传递给上传,而不是将zip文件下载到机器A,然后传递到上传URL。
谢谢, 卡莱
答案 0 :(得分: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)
循环; - )