`
kjkhi
  • 浏览: 182308 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ExtJS中使用jspSmartUpload实现文件下载

阅读更多
项目需求:使用Ext的GridPanel实现文件下载功能!如

首先,在gridpanel中加入链接style的button。在gridpanel的ColumnModel中
renderer:function(){return "<p><button type='submit' class='link' onclick='downloadfile("+v+")'><span>下载</span></button></p>"}

加入button style。
button.link {
			font-family: "Verdana" sans-serif;
			font-size: 1em;
			text-align: left;
			color: blue;
			background: none;
			margin: 0;
			padding: 0;
			border: none;
			cursor: pointer;
		}

其下载任务,都在downloadfile(v)这个方法中实现,代码
downloadfile = function(v){
				Ext.Ajax.request({
					url:"getFilePath_fileIO",
					params:{"fileId":v},
					success:function(response){
						var fileJson = Ext.decode(response.responseText);

						var filepath = encodeURIComponent(fileJson.filepath);
						var filename = encodeURIComponent(fileJson.filename);
						window.open("downloadfile.jsp?filepath="+filepath+"&filename="+filename,"_self");
					},
					failure:function(response){
					
					}
				});
			}

在downloadfile.jsp页面中,使用jspSmartUpload提供的API实现下载。
	String filepath = request.getParameter("filepath");
	String filename = request.getParameter("filename");
	filepath = filepath.replace("/","\\");
	
	SmartUpload su = new SmartUpload();
	//初始化
	su.init(config);
	su.service(request,response);
	//禁止浏览器自动打开文件
	su.setContentDisposition(null);
	
	//下载文件
	String path = new String(filepath.getBytes("ISO8859-1"),"UTF-8");
	String name = new String(filename.getBytes("ISO8859-1"),"UTF-8");
//	System.out.print(name);	
	su.downloadFile(path,null,name);
	out.clear();
	out = pageContext.pushBody();


ps:jspSmartUpload在默认的情况,并不支持下载文件名为中文的。这里我们需要做一些编码的转换,在SmartUpload中加入toUtf8String(String)这个方法,如
  public static String toUtf8String(String s)
  {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      if ((c >= 0) && (c <= 'ÿ')) {
        sb.append(c); } else {
        byte[] b;
        try {
          b = Character.toString(c).getBytes("utf-8");
        }
        catch (Exception ex)
        {
          byte[] b;
          System.out.println(ex);
          b = new byte[0];
        }
        for (int j = 0; j < b.length; j++) {
          int k = b[j];
          if (k < 0)
            k += 256;
          sb.append("%" + Integer.toHexString(k).toUpperCase());
        }
      }
    }
    return sb.toString();
  }

修改SmartUpload中downloadFile(String s, String s1, String s2, int i)这个方法,如
public void downloadFile(String s, String s1, String s2, int i)
    throws ServletException, IOException, SmartUploadException
  {
    if (s == null)
      throw new IllegalArgumentException("File '" + s + 
        "' not found (1040).");
    if (s.equals(""))
      throw new IllegalArgumentException("File '" + s + 
        "' not found (1040).");
    if ((!isVirtual(s)) && (this.m_denyPhysicalPath))
      throw new SecurityException("Physical path is denied (1035).");
    if (isVirtual(s))
      s = this.m_application.getRealPath(s);
    java.io.File file = new java.io.File(s);
    FileInputStream fileinputstream = new FileInputStream(file);
    long l = file.length();
    boolean flag = false;
    int k = 0;
    byte[] abyte0 = new byte[i];
    if (s1 == null)
      this.m_response.setContentType("application/x-msdownload");
    else if (s1.length() == 0)
      this.m_response.setContentType("application/x-msdownload");
    else
      this.m_response.setContentType(s1);
    this.m_response.setContentLength((int)l);
    this.m_contentDisposition = (this.m_contentDisposition != null ? this.m_contentDisposition : 
      "attachment;");
    if (s2 == null)
      this.m_response.setHeader("Content-Disposition", this.m_contentDisposition + 
        " filename=" + toUtf8String(getFileName(s)));
    else if (s2.length() == 0)
      this.m_response.setHeader("Content-Disposition", this.m_contentDisposition);
    else
      this.m_response.setHeader("Content-Disposition", this.m_contentDisposition + 
        " filename=" + toUtf8String(s2));
    while (k < l) {
      int j = fileinputstream.read(abyte0, 0, i);
      k += j;
      this.m_response.getOutputStream().write(abyte0, 0, j);
    }
    fileinputstream.close();
  }

这样,基本上能够实现对中文名文件的下载!
分享到:
评论
2 楼 xlshl43 2013-09-03  
还是自己创建表单来的放心,什么错都没有
1 楼 李成林_89 2012-02-24  
学习学习~~~

相关推荐

Global site tag (gtag.js) - Google Analytics