论坛首页 Web前端技术论坛

GXT 文件上传

浏览 6047 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-12-20  

关于GWT的文件上传网上有封装比较好的例子 大家可以搜索:gwtextux。

gwtextux是基于GWT-EXT开发的。本文写的是针对GXT组件开发的文件上传例子。

 

GXT 文件上传主要分五步:

 

第一步,设置Form的提交属性

 

 

// 选择上传路径 form
FormPanel formPanel = new FormPanel ();
// 设置form参数MULTIPART
formPanel.setEncoding (FormPanel.Encoding.MULTIPART);
// 设置提交方式POST
formPanel.setMethod (FormPanel.Method.POST);
// 设置上传请求地址
formPanel.setAction ("fileupload.do");
 

 

第二步:添加上传组件

 

// 文件选择
FileUploadField fileUploadField = new FileUploadField ();
fileUploadField.setFieldLabel ("请选择上传文件");
fileUploadField.setName ("file");

 

  第三步:提交按钮

 

Button button = new Button ("上传");
        button.addListener (Events.OnClick, new Listener <BaseEvent> ()
        {
            @Override
            public void handleEvent (BaseEvent be)
            {
                formPanel.submit ();
            }

 

  第四步:后台接受上传流的Servlet

 

public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {

        // 获取上传句柄
        ServletFileUpload upload = new ServletFileUpload ();
        FileItemIterator iter;
        HttpSession session = request.getSession ();
        // 获取文件长度
        String fileSizeString = request.getHeader ("Content-Length");

        //将文件长度转化为数字
        String sourceidString = null;
        try
        {
            // 从request中获取参数
            iter = upload.getItemIterator (request);
            while (iter.hasNext ())
            {
                FileItemStream item = iter.next ();
                // 资源名称
                if (TermStrings.SOURCE_FILED.equals (item.getFieldName ()))
                {
                    InputStream stream = item.openStream ();
                    sourceidString = Streams.asString (stream, "utf-8");
                                  }
                // 获取文件输入流
                if ("file".equals (item.getFieldName ()))
                {
                    // 获得系统时间
                    BufferedInputStream bin = new BufferedInputStream (item.openStream ());
                    // 获得文件路径
                    String filePath = getServletContext ().getRealPath ("后台存储文件.xls");
                  
                    File file = new File (filePath);
		    // 创建写文件的流
                    BufferedOutputStream bout = new BufferedOutputStream (new FileOutputStream (file));
                    byte[] b = new byte[8 * 1024];

                    int i = bin.read (b);
                    while (i > 0)
                    {
		        //写入文件
                        bout.write (b, 0, i);
                        i = bin.read (b);
                    }
                    bout.flush ();
                    bout.close ();

  第五步:web.xml

 

 

 <servlet-mapping>
    <servlet-name>FileUpload</servlet-name>
    <url-pattern>/fileupload.do</url-pattern>
  </servlet-mapping>

    <servlet>
    <servlet-name>FileUpload</servlet-name>
    <servlet-class>net.carefx.term.server.servlet.FileUpload</servlet-class>
  </servlet>
 

 

如果要实现读取进度,我的做法是时间轮训,通过后台获取文件长度:

        String fileSizeString = request.getHeader ("Content-Length");

总长度,然后根据文件写入流的写入次数判断写入的百分比。将此数据在前台显示。

文件上传需要使用第三方jar包

 

commons-fileupload-1.2.1.jar


   发表时间:2010-12-27  
前面写得挺好的,后台那段代码不敢恭维。
既然用了fileupload ,你就使用它提供的方法呀,何必自己“纯手工”再写一次。

String path =  req.getSession().getServletContext().getRealPath("/");

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List items = null;
try {
	items = upload.parseRequest(req);
} catch (FileUploadException e) {
	e.printStackTrace();
	return ;
}

Iterator iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (item.getName() == null || item.getName().trim().equals(""))
	continue;
    String filename = getFileName();
    if ( ! item.isFormField()) {
    	File uploadedFile = new File("replace with your file name");
    	try {
	   item.write(uploadedFile);
        } catch (Exception e) {
	e.printStackTrace();
	return null;
} 
}
}



你看,还支持同时上传多个文件。

推荐 使用 swfupload
0 请登录后投票
   发表时间:2010-12-27  
lovexp2010 写道
前面写得挺好的,后台那段代码不敢恭维。
既然用了fileupload ,你就使用它提供的方法呀,何必自己“纯手工”再写一次。

String path =  req.getSession().getServletContext().getRealPath("/");

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

List items = null;
try {
	items = upload.parseRequest(req);
} catch (FileUploadException e) {
	e.printStackTrace();
	return ;
}

Iterator iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (item.getName() == null || item.getName().trim().equals(""))
	continue;
    String filename = getFileName();
    if ( ! item.isFormField()) {
    	File uploadedFile = new File("replace with your file name");
    	try {
	   item.write(uploadedFile);
        } catch (Exception e) {
	e.printStackTrace();
	return null;
} 
}
}



你看,还支持同时上传多个文件。

推荐 使用 swfupload

谢谢,学习了。我之前手工写流是想做上传进度展示。
0 请登录后投票
   发表时间:2011-01-09  
Lz可以考虑一下GWTupload这个上传组件解决上传进度条的问题。
我在项目就是用这个组件来实现的。
但是这个组件好像有个bug,就是该组件的重置功能有点问题。。
0 请登录后投票
   发表时间:2011-02-10  
原来整这个 整了个多附件上传
0 请登录后投票
   发表时间:2011-02-17  
恩,2010的后台代码简洁明了,很不错。学习了...刚开始学习EXT,还有许多问题不明白,持续学习ing
0 请登录后投票
   发表时间:2011-03-13  
請問,如何自動產生上傳後的影片縮圖?
0 请登录后投票
   发表时间:2011-03-14  
kannif2005 写道
請問,如何自動產生上傳後的影片縮圖?

我没有做过类似工作,但是我想生产缩略图的操作应该是后台java实现,然后将缩略图返回给前台。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics