专注于高品质PHP技术等信息服务于一体 [STIEMAP] [RSS]

百度提供的广告:
java
当前位置:首页 > 技术文档 > java >  > 
jspsmart中文文件下载方法

JSP 中文文件下载
照网上说的方法对其进行改造,添加toUtf8String方法后IE显示正常,firefox 显示的就是unicode 编码还是乱码,怪不得我从csdn 上下载的文件都是乱码。
 
 网上的两种方法:
 1,通用下载法
 <%
  java.io.BufferedInputStream bis=null;
  java.io.BufferedOutputStream  bos=null;
 try
 {
   String filename=request.getParameter("filename");
    filename=new String(filename.getBytes("iso8859-1"),"gb2312");// 在测试的时候报硬盘错误,其它读其中的代码也不难看出,仅是读入文件,这个改不改编码意义不大。
   response.setContentType("application/x-msdownload");
   response.setHeader("Content-disposition","attachment; "+
    "filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
  String filepath = "C:\\Tomcat\\webapps\\lynews\\upload\\";
   bis =new java.io.BufferedInputStream(new java.io.FileInputStream("+
    "config.getServletContext().getRealPath("files/" +filepath+ filename)));
   bos=new java.io.BufferedOutputStream(response.getOutputStream());
   byte[] buff = new byte[2048];
   int bytesRead;
   while(-1 != (bytesRead = bis.read(buff, 0, buff.length)))
   {
    bos.write(buff,0,bytesRead);
   }
 }
 catch(Exception e)
 {
    e.printStackTrace();
 }
 finally
 {
    if(bis != null)bis.close();
    if(bos != null)bos.close();
 }
%>

2,SmartUpload 改造法
    /**
     * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
     * 纵横软件制作中心雨亦奇2003.08.01
     * @param s 原文件名
     * @return 重新编码后的文件名
     */
    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 <= 255) {
        sb.append(c);
        } else {
        byte[] b;
        try {
            b = Character.toString(c).getBytes("utf-8");
        } catch (Exception ex) {
            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();
    }
 
解决方法:

public static String toUtf8String(String s) {
    try {
        return new String(s.getBytes("GBK"),"iso-8859-1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return s;
}

PHP 代码:
<?php
$file = $_REQUEST ['filename'];
$filename = "download/" . $file; //文件必须放到 download目录下
$downfilename = $file;
header ("Pragma:   no-cache");
header ("Expires:   0");
header("Cache-control:   private");
Header ( "Content-type: application/octet-stream" );
Header ( "Accept-Ranges: bytes" );
Header ( "Accept-Length: " . filesize ( $filename ) );
Header ( "Content-Disposition: attachment; filename=" . $downfilename );
$file = fopen ( $filename, "r" );
echo fread ( $file, filesize ( $filename ) );
fclose ( $file );
?>
这两个的原理 是一样的,不过PHP文件名称是正常的,这可能和JVM有关吧