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有关吧