java发布sevlet_java-使用GZIPOutputStream将文件发布到servlet时...

我试图修改@BalusC优秀教程here以发送gzip压缩文件.这是一个有效的java类:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import java.util.zip.GZIPOutputStream;

public final class NetworkService {

// *** EDIT THOSE AS APROPRIATE

private static final String FILENAME = "C:/Dropbox/TMP.txt";

private static final String URL =

"http://192.168.1.64:8080/DataCollectionServlet/";

// *** END EDIT

private static final CharSequence CRLF = "\r\n";

private static boolean isServerGzip = true; // ***

private static String charsetForMultipartHeaders = "UTF-8";

public static void main(String[] args) {

HttpURLConnection connection = null;

OutputStream serverOutputStream = null;

try {

File file = new File(FILENAME);

final String boundary = Long

.toHexString(System.currentTimeMillis());

connection = connection(true, boundary);

serverOutputStream = connection.getOutputStream();

try {

flushMultiPartData(file, serverOutputStream, boundary);

} catch (IOException e) {}

System.out.println(connection.getResponseCode()); // 200

} catch (IOException e) {

// Network unreachable : not connected

// No route to host : probably on an encrypted network

// Connection timed out : Server DOWN

} finally {

if (connection != null) connection.disconnect();

}

}

private static HttpURLConnection connection(boolean isMultiPart,

String boundary) throws MalformedURLException, IOException {

HttpURLConnection connection = (HttpURLConnection) new URL(URL)

.openConnection();

connection.setDoOutput(true); // triggers POST

connection.setUseCaches(false); // *** no difference

connection.setRequestProperty("Connection", "Keep-Alive");

connection.setRequestProperty("User-Agent",

"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) "

+ "Gecko/20100401"); // *** tried others no difference

connection.setChunkedStreamingMode(1024); // *** no difference

if (isMultiPart) {

if (boundary == null || "".equals(boundary.trim()))

throw new IllegalArgumentException("Boundary can't be "

+ ((boundary == null) ? "null" : "empty"));

connection.setRequestProperty("Content-Type",

"multipart/form-data; boundary=" + boundary);

}

return connection;

}

// =========================================================================

// Multipart

// =========================================================================

private static void flushMultiPartData(File file,

OutputStream serverOutputStream, String boundary)

throws IOException {

PrintWriter writer = null;

try {

// true = autoFlush, important!

writer = new PrintWriter(new OutputStreamWriter(serverOutputStream,

charsetForMultipartHeaders), true);

appendBinary(file, boundary, writer, serverOutputStream);

// End of multipart/form-data.

writer.append("--" + boundary + "--").append(CRLF);

} finally {

if (writer != null) writer.close();

}

}

private static void appendBinary(File file, String boundary,

PrintWriter writer, OutputStream output)

throws FileNotFoundException, IOException {

// Send binary file.

writer.append("--" + boundary).append(CRLF);

writer.append(

"Content-Disposition: form-data; name=\"binaryFile\"; filename=\""

+ file.getName() + "\"").append(CRLF);

writer.append(

"Content-Type: " // ***

+ ((isServerGzip) ? "application/gzip" : URLConnection

.guessContentTypeFromName(file.getName())))

.append(CRLF);

writer.append("Content-Transfer-Encoding: binary").append(CRLF);

writer.append(CRLF).flush();

InputStream input = null;

OutputStream output2 = output;

if (isServerGzip) {

output2 = new GZIPOutputStream(output);

}

try {

input = new FileInputStream(file);

byte[] buffer = new byte[1024]; // *** tweaked, no difference

for (int length = 0; (length = input.read(buffer)) > 0;) {

output2.write(buffer, 0, length);

}

output2.flush(); // Important! Output cannot be closed. Close of

// writer will close output as well.

} finally {

if (input != null) try {

input.close();

} catch (IOException logOrIgnore) {}

}

writer.append(CRLF).flush(); // CRLF is important! It indicates end of

// binary boundary.

}

}

您必须编辑FILENAME和URL字段并在URL中设置一个servlet-其doPost()方法为:

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

Collection parts = req.getParts();

for (Part part : parts) {

File save = new File(uploadsDirName, getFilename(part) + "_"

+ System.currentTimeMillis() + ".zip");

final String absolutePath = save.getAbsolutePath();

log.debug(absolutePath);

part.write(absolutePath);

sc.getRequestDispatcher(DATA_COLLECTION_JSP).forward(req, resp);

}

}

现在,当isServerGzip字段设置为true时,FILENAME被压缩并发送到服务器,但是当我尝试提取它时,它已损坏(我在Windows上使用7z,它将打开gzip文件作为存档,但是当我尝试提取其中的文件时,表示已损坏的gzip存档-尽管确实提取了(确实损坏的)文件).尝试了各种文件-较大的文件最终在某个点被破坏,较小的文件最终提取为空-档案中较大文件的报告大小比真实文件大得多,而较小文件为0.我标记了需要注意// ***.我可能会错过一些连接配置,或者我用gzip压缩流的方式可能是完全错误或…?

尝试调整连接属性,缓冲区,缓存等无济于事

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值