我正在使用GWT(Google Web Toolkit)来制作网站。我需要向用户显示一个表,并让用户下载表的内容。
在客户端,用户在按下"下载"按钮时如何下载文件?
"下载"按钮有一个onClick()
侦听器。并且客户端类扩展Composite
.
我试图使类扩展HttpServlet
,但它变得太复杂了。
我已经在这里阅读了帖子:
- http://www.mkyong.com/java/how-to-download-file-from-website-java-jsp/
- 使用 Servlet 下载文件时如何使用 GWT?
但我仍然不知道如何在客户端向用户提供可下载的文件。
你真的需要区分GWT客户端Java代码和服务器端java代码。
在 GWT Java 代码中的客户端
String url = GWT.getModuleBaseURL() + "downloadService?fileInfo1=" + fileInfo1;
Window.open( url, "_blank", "status=0,toolbar=0,menubar=0,location=0");
在服务器端的非 gwt Java 代码中-
在网络中.xml
<servlet>
<servlet-name>downloadService</servlet-name>
<servlet-class>AAA.BBB.CCC.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downloadService</servlet-name>
<url-pattern>/<gwtmodulename>/downloadService</url-pattern>
</servlet-mapping>
在服务器包代码中,一个 servlet
public class DownloadServlet extends HttpServlet{
protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException
{
String fileName = req.getParameter( "fileInfo1" );
int BUFFER = 1024 * 100;
resp.setContentType( "application/octet-stream" );
resp.setHeader( "Content-Disposition:", "attachment;filename=" + """ + fileName + """ );
ServletOutputStream outputStream = resp.getOutputStream();
resp.setContentLength( Long.valueOf( getfile(fileName).length() ).intValue() );
resp.setBufferSize( BUFFER );
//Your IO code goes here to create a file and set to outputStream//
}
}
确保将文件内容推送到**outputStream**
。
如果您知道文件的路径,则代码片段如下所示。
button.addClickHandler(new ClickHandler()
{
@Overrid
public void onClick(ClickEvent event)
{
Window.open(GWT.getHostPageBaseURL() + "/file.rar", "name", "enabled");
}
});
您可以尝试使用 GWT 在客户端上读取和写入文件
http://www.emitrom.com/blog/client-io
要完成io部分中第一项的答案...
您可以参考此链接
http://www.programcreek.com/2009/02/java-convert-a-file-to-byte-array-then-convert-byte-array-to-a-file/
或参考此代码
File file = new File(enter the filepath here)
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum); //no doubt here is 0
//Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {
System.err.println("unable to convert to bytes");
}
byte[] bytes = bos.toByteArray();
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
希望对您有所帮助!