我希望能够通过网络读取多个数据流并将文件写入网络以组合所有这些多个文件。
由于文件可能非常大,我不想做任何本地IO文件操作,而是对数据流进行操作。 从网络读取流,将流以 zip 格式写入网络。
我正在尝试下面的示例代码,但我没有看到远程主机上正在写入任何文件。
如果我使用 FileInputStream
而不是通过网络写入,那么写入本地磁盘文件就可以了。
我缺少什么来写入网络?
InputStream input = new URL("http://www.cacr.caltech.edu/projects/danse/talks/kickoff/07-Butler/SANS_DANSEkickoffAug06.pdf").openStream();
URL url = new URL("http://posttestserver.com/post.php?dir=ziptest");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
ZipOutputStream zipOutputStream = new ZipOutputStream(connection.getOutputStream());
zipOutputStream.putNextEntry(new ZipEntry("1.pdf"));
byte[] buffer = new byte[0xFFFF];
for (int len; (len = input.read(buffer)) != -1;) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.putNextEntry(new ZipEntry("2.pdf"));
InputStream input1 = new URL("http://www.pdf995.com/samples/pdf.pdf").openStream();
for (int len; (len = input1.read(buffer)) != -1;) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.close();
int responseCode = connection.getResponseCode();
System.out.println("HTTP response code="+responseCode);
connection.disconnect();
最佳答案
您没有进行任何输入,因此实际上什么也没有发生。您至少需要获取 HTTP 响应代码:
int responseCode = connection.getResponseCode();
System.out.println("HTTP response code="+responseCode);
更好的是,根据需要读取输入或错误流,然后将其关闭。
编辑 您是否考虑过检查这些文件?这是我刚刚创建的:
Time: Thu, 26 Oct 17 05:36:04 +0000
Source ip: 107.23.92.82
Headers (Some may be inserted by server)
HTTP_ACCEPT_LANGUAGE = en
HTTP_HOST = posttestserver.com
HTTP_CONNECTION = Keep-Alive
HTTP_USER_AGENT = Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5
HTTP_ACCEPT_ENCODING = gzip,deflate
REMOTE_ADDR = 107.23.92.82
DOCUMENT_ROOT = /var/www/html
REQUEST_SCHEME = http
CONTEXT_PREFIX =
CONTEXT_DOCUMENT_ROOT = /var/www/html
REMOTE_PORT = 52482
GATEWAY_INTERFACE = CGI/1.1
REQUEST_METHOD = GET
QUERY_STRING = dir=ziptest
REQUEST_URI = /post.php?dir=ziptest
PHP_SELF = /post.php
REQUEST_TIME_FLOAT = 1508996164.351
REQUEST_TIME = 1508996164
No Post Params.
Empty post body.
您需要将正文写成名称-值配对参数,例如'压缩文件=......................'。任何人都在猜测这将如何处理二进制数据。严格来说,您应该对数据进行 URL 编码。但真正需要什么取决于您的目标系统的行为方式。很可能您应该使用 PUT 而不是 POST。
关于java - ZipOutputStream 到网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945815/