【发布时间】:2011-08-24 22:56:43
【问题描述】:
我想从我的 gwt Web 应用程序中的点击事件开始下载文件。所以我写了一个 Servlet,它将数据写入输出并开始下载。通过http get接收数据。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = request.getParameter("data");
String filename = request.getParameter("filename");
byte[] streamData = data.getBytes();
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "attachment; fileName="
+ filename + ".csv");
response.setContentLength(streamData.length);
ServletOutputStream out = response.getOutputStream();
out.write(streamData);
out.flush();
}
在客户端我通过 requestBuilder.sendRequest() 启动 get 方法:
RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, /download");
requestBuilder.sendRequest("filename=dues&data="+ theDataAsString, new RequestCallback() {
@Override
public void onResponseReceived(Request request,
Response response) {
// Anything to do here?
}
@Override
public void onError(Request request, Throwable exception) {
exception.printStackTrace();
SC.warn("Error while creating export file.");
}
});
什么都没有发生。但为什么?浏览器不应该要求开始下载吗?
在这种情况下,我使用 post 还是 get 是否重要?
我不想使用类似的东西
Window.open("/download?data=myData&filename=filename", "_blank", "");
有什么想法吗?
【问题讨论】:
-
servlet 只在响应正文中返回检索到的请求参数(可能使用错误的字符编码)。那么这里 servlet 的全部目的是什么?我不做 GWT,但你为什么不直接把它写到它的响应中呢?
-
@BalusC:问题在于所有的 GWT Java 代码都被翻译成 JavaScript 并且不支持
java.io.*,所以我必须使用 Servlet。但你对编码是正确的,在我的情况下,我应该使用“text/csv”。 (但实际上“应用程序/强制下载”也可以) -
Re GWT:好的。重新编码:不,我的意思是您需要在
String#getBytes()和HttpServletResponse#setCharacterEncoding()中指定的字符编码。不指定字符编码将导致使用平台默认值,如果字符最初不是使用相同的编码进行编码,则可能会导致字符格式错误。 -
好的,谢谢您的提示。但是我还没弄明白:编码会导致Servlet平台默认吗?还是会是发送客户端(我的 smartgwt 客户端)的编码?
标签: java gwt servlets get httprequest