GWT 实现文件上传和下载

    技术2022-05-20  42

    上星期老师叫我学写一个fileupload 和 download ,琢磨了很久~~ 代码网上很多,关键跑出来有效果 是很纠结人的。。整理一下吧。

     

    upload:(推荐一本书 《Google Web Toolkit 开发实战》 第九章有详细的说明 )

     

    首先下载两个包 commons-fileupload-?.jar和commons-io-?.jar  将他们配置到你的项目中

    先把它们放在 "项目名/war/WEB-INF/lib" 中,之后直接在 properties 中加入到项目中(没配置过可以去网上查eclipse配置jar的方法,很简单的)

     

    之后就开始啦,client 端代码:

    final FileUpload fileUpload = new FileUpload(); final FormPanel formpanel = new FormPanel(); fileUpload.setName("uploadFormElement"); formpanel.setEncoding( FormPanel.ENCODING_MULTIPART ); formpanel.setMethod( FormPanel.METHOD_POST ); formpanel.setAction( GWT.getModuleBaseURL() + "fileupload" ); formpanel.setWidget( fileUpload ); uploadbutton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent sender ) { formpanel.submit(); } }); formpanel.addSubmitHandler( new SubmitHandler() { public void onSubmit(SubmitEvent event) { if( fileUpload.getFilename().length() == 0 ) { Window.alert( "you must select a file" ); } } }); formpanel.addSubmitCompleteHandler( new SubmitCompleteHandler() { public void onSubmitComplete(SubmitCompleteEvent event) { //兼容linux文件分隔符? String selected = fileUpload.getFilename().replaceAll("/", "//"); selected = selected.substring( selected.lastIndexOf("//")+1); Window.alert( "upload complete"+ event.getResults()); } });

    之后再server中添加服务 :FileUploadServlet.java

    package sample.server; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List items = null; try { items = upload.parseRequest(request); } catch (FileUploadException ex) { ex.printStackTrace(); } Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); String savePath = getServletContext().getRealPath("/uploads"); String filename = item.getName(); String filename2 = filename.replaceAll("/", "//"); int pos = filename.lastIndexOf( "//") + 1; File file = new File(savePath,filename.substring( pos ) ); try { item.write(file); } catch (Exception e) { e.printStackTrace(); } } } }

     

    最后 最重要的一步!! 打开web.xml 加入

    <servlet> <servlet-name>uploadServlet</servlet-name> <servlet-class>sample.server.FileUploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>uploadServlet</servlet-name> <url-pattern>/login/fileupload</url-pattern> </servlet-mapping>

    两个servlet-name 相同即可 而servlet-class对应之前添加的服务,url-pattern对应 client端中的

    formpanel.setAction( GWT.getModuleBaseURL() + "fileupload" );

    打开 xxx.gwt.xml 加入 :<servlet class="sample.server.FileUploadServlet" path="/fileupload" />

    class 和 path也是对应的,别搞错啦,不然会悲剧的

     

    好吧可以运行试试了,下面看download

     

    download简单一点点,client中代码:

    void download( String filename ) { if( RootPanel.get("downloadiframe") != null ) { Widget widgetFrame = (Widget)RootPanel.get("downloadiframe"); widgetFrame.removeFromParent(); } Frame frame = new Frame( GWT.getModuleBaseURL() + "filedownload" + "?id=downloadiframe"+ "&filename=" + filename ); frame.setVisible( false ); frame.setSize( "0px", "0px" ); RootPanel.get().add( frame ); }

     

    同样新建一个 DownloadServlet.java 有了之前的经验相信大家应该找到点头绪了吧? 代码:

    package sample.server; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Frame; public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { //此函数对应之前的 Frame frame = //new Frame( GWT.getModuleBaseURL() + "filedownload" + "?id=downloadiframe"+"&filename=" + filename ); //传文件名那个简单啊 String filename = req.getParameter("filename"); //这边你要自己决定从哪下载的文件!! 我是把上传路径直接给他了 //这里说下。。我先前没自己创建 uploads 结果十分悲剧 //记得在 war 路径下创建 !! String filepath = req.getRealPath("/uploads"); File file = new File( filepath+"/"+filename ); //下面代码从网上拉的,直接抄就行了 FileInputStream fis = new FileInputStream(file); resp.addHeader("Content-Disposition","attachment; filename=" + filename ); ServletOutputStream out = resp.getOutputStream(); resp.setBufferSize(32768); int bufSize = resp.getBufferSize(); byte[] buffer = new byte[bufSize]; BufferedInputStream bis = new BufferedInputStream(fis,bufSize); int bytes; while ((bytes = bis.read(buffer, 0, bufSize)) >= 0) out.write(buffer, 0, bytes); bis.close(); fis.close(); out.flush(); out.close(); } }

     

     

    配置两个xml和upload是一样的,注意别拼错字母了呀!!!!

     

    因为感觉网上的代码确实很纠结一会才能成功的。。所以就自己整理一下了,希望帮到你们啦~~

     

     

     


    最新回复(0)