jsp中打开pdf文件:中文目录(中文文件名)问题

http://topic.csdn.net/t/20030919/16/2279308.html

楼主lymkelly(柳叶眉)2003-09-19 16:25:31 在 Java / Web 开发 提问

jsp中打开pdf文件:中文目录(中文文件名)问题  
  我的  
  直接打开  
  或者  
  用输入输出流  
  的  
  英文的目录,文件名实现了  
   
  但是,中文的目录名,文件名实现不了  
  上面的实现在另外一个贴字里http://expert.csdn.net/Expert/topic/2271/2271350.xml?temp=.7396814  
   
  还望大虾帮助,不胜感激 问题点数:0、回复次数:40Top

1 楼majorinjava(编程浪子)回复于 2003-09-19 16:56:38 得分 0

这是因为中文地址编码的问题,你可以这样去实现。  
  <%@   page   import="java.net.*"   %>  
  <%  
      String   addr=URLEncoder.encode("文件测试.doc");  
  %>  
  <a   href="<%=addr%>">   文件测试.doc   </a>Top

2 楼GaoLun(高论)回复于 2003-09-19 17:08:04 得分 0

同意楼上的,  
  应为JSP本该就有中文问题!Top

3 楼smartzhang(每天多学一点)回复于 2003-09-19 17:31:10 得分 0

用的什么服务器  
  具体问题具体分析Top

4 楼lymkelly(柳叶眉)回复于 2003-09-19 21:40:16 得分 0

用的tomcat4  
  Top

5 楼lymkelly(柳叶眉)回复于 2003-09-19 21:46:09 得分 0

不是不是  
  to:majorinjava(编程浪子)    
  word的文件没有问题  
  pdf的不可以Top

6 楼lymkelly(柳叶眉)回复于 2003-09-19 22:50:00 得分 0

希望大虾帮助!!  
  非常感谢!!!!!!!!!Top

7 楼liad()回复于 2003-09-21 15:22:37 得分 0

用apache   http   server整合tomcat试试  
   
  下面只用apache   http   server,  
  在IE中用  
  file:///E:/Apache/htdocs/雅思英语学习/东方雅思资料.pdf  
  http://localhost/%D1%C5%CB%BC%D3%A2%D3%EF%D1%A7%CF%B0/%B6%AB%B7%BD%D1%C5%CB%BC%D7%CA%C1%CF.pdf  
  可以正常打开文件  
   
  用  
  http://localhost/雅思英语学习/东方雅思资料.pdf  
  提示  
  HTTP   404   -   File   not   found  
  Internet   Explorer    
   
  Top

8 楼lymkelly(柳叶眉)回复于 2003-09-22 11:48:00 得分 0

非常感谢liad()   ,你真是给了我黑暗中的一缕光明!  
  我去试一试,Top

9 楼lymkelly(柳叶眉)回复于 2003-09-22 16:16:56 得分 0

我现在还没有尝试出来  
  不过呢  
  用apach以后我的htm网页都成了乱码了!!  
  Top

10 楼Alps_lou(云飞扬)回复于 2003-09-22 16:31:51 得分 0

在tomcat的web.xml中加上一下的内容  
  <mime-mapping>  
          <extension>pdf</extension>  
          <mime-type>application/pdf</mime-type>  
  </mime-mapping>Top

11 楼lymkelly(柳叶眉)回复于 2003-09-22 16:42:18 得分 0

to:liad()   (   )    
  如果大虾的可以的话  
  请详细说明  
   
  我得不可以  
  555555555555555555555  
  急盼!!!!!!!!!!!!!Top

12 楼lymkelly(柳叶眉)回复于 2003-09-22 17:23:51 得分 0

to:Alps_lou(云飞扬)   (  
  我修改的我的发行目录(wabapp)下的web.xml  
  还是不行  
   
  不过呢  
  我觉得问题应该和这个有关  
  :因为   office的.doc等等的打开都没有问题的  
  但是中文url编码以后呢  
  所有的都不行了Top

13 楼kinoviti(-=K.V=-)回复于 2003-09-22 19:22:42 得分 0

首先,尝试使用   修改mime来解决  
  其次,如果是先显示目录再点击进入另一个jsp打开对应的pdf,这个就需要作  
  一些比较麻烦的操作。  
  比如从A.jsp(目录文件)到   B.jsp(pdf打开)  
  从A到B传送的文件名会被IE重新编码,与此同时IE这个时候只能认识  
  %as%sd%...这种格式的16进制汉字编码,你要做的就是先把得到的文件名  
  进行ISO-8859-1   /   UTF-8编码   然后对编码后产生的Byte数组进行依次  
  编码为16进制,组成一个字符串,同时再每一位转换成的16进制头尾分别  
  加上%     这样就可以了。  
  以上   我是基于Tomcat+Unix作服务器的经验。  
  如果其他方式能够实现,请赐教Top

14 楼lymkelly(柳叶眉)回复于 2003-09-22 19:49:46 得分 0

to:kinoviti(-=K.V=-)   (  
  大虾说得比较高深  
  我不是太理解  
  可是有个问题阿  
  为什么   word等的文件不需要字符转换呢  
   
  Top

15 楼lymkelly(柳叶眉)回复于 2003-09-22 20:14:20 得分 0

可是  
  为什么  
  word的文档可以呢  
  中文的文件名也可以打开Top

16 楼lymkelly(柳叶眉)回复于 2003-09-22 20:16:24 得分 0

http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张国立/申请书.doc  
  就可以打开Top

17 楼csdnxw(大家帮忙)回复于 2003-09-23 09:55:15 得分 0

这位老兄跟张兄认识?Top

18 楼lymkelly(柳叶眉)回复于 2003-09-23 15:33:44 得分 0

没有  
  是我们学校的一位老师的名字本来在那里  
  不过我怕发上去万一。。。。。。不太好  
  就想一个名字吧。。。。。嘻嘻   张兄的名字就出来了  
  哈哈  
   
  Top

19 楼lymkelly(柳叶眉)回复于 2003-09-23 15:35:10 得分 0

哎呀,我的问题还没有解决呢  
  怎么还没有人回答阿555555555555555555555555555555555Top

20 楼liad()回复于 2003-09-23 16:18:23 得分 0

完整的  
  //   DispPDF.java  
   
  package   pdf;  
   
  import   java.io.*;  
  import   java.net.*;  
  import   java.util.*;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
   
  public   class   DispPDF   extends   HttpServlet  
  {  
  public   void   doGet(HttpServletRequest   request,   HttpServletResponse   response)   throws   ServletException,   IOException    
  {  
  InputStream   in   =   null;  
  ServletOutputStream   out   =   null;  
   
  try   {  
  response.reset();  
  out   =   response.getOutputStream();  
  response.setContentType("application/pdf");  
  in   =   new   BufferedInputStream(new   FileInputStream(getServletContext().getRealPath("/")   +   "测试/文档.pdf"));  
  int   ch;  
   
  while   (   (ch   =   in.read())   !=   -1   )   {  
  out.print(   (char)ch   );  
  }  
  }   catch   (Exception   e)   {  
  e.printStackTrace();  
  }   finally   {  
  if(   in   !=   null   )   {  
  in.close();  
  }  
  if(   out   !=   null   )   {  
  out.flush();  
  out.close();  
  }  
  }  
  }    
  }  
  Top

21 楼lymkelly(柳叶眉)回复于 2003-09-23 17:13:36 得分 0

谢谢liad()   (:  
  我去试一下  
  Top

22 楼intelchen(intelchen)回复于 2003-09-23 17:42:18 得分 0

个人觉得kinoviti(-=K.V=-)   那个是正解,  
  但是我不确定最后一句话“同时再每一位转换成的16进制头尾分别  
  加上%”  
  如果我的路径是“http://localhost/english/雅     思/雅思英语学习/东方雅思资料.pdf”  
  对应到我的文件系统的路径是"c:/tomcat/webapps/english/雅     思/雅思英语学习/东方雅思资料.pdf"  
  我是不是只要将“c:/tomcat/webapps/english/”保持不变“/雅     思/雅思英语学习/东方雅思资料.pdf”的每个字符(包括空格之类的特殊符号)前加上%就可以?  
  如果是路径是“c:/tomcat/webapps/english/雅     思/雅思英语学习/pdf/东方雅思资料.pdf”  
  那“雅     思/雅思英语学习/pdf/东方雅思资料.pdf”中的那个“pdf”并不需要加上%?  
  不知道你有没有源程序给我们看看?  
   
  Top

23 楼lymkelly(柳叶眉)回复于 2003-09-23 21:53:08 得分 0

楼上的理解对吗???????????  
  大虾指教Top

24 楼lymkelly(柳叶眉)回复于 2003-09-23 22:17:45 得分 0

to:liad()   (:  
  我试验了   不行的  
  中文的不行  
  英文的可以Top

25 楼lymkelly(柳叶眉)回复于 2003-09-23 22:38:07 得分 0

英文的也不行!!!  
  总是空白的也面!!!!!!!1  
   
   
   
   
     
   
  我用的一个大虾的办法:  
  中文的不可以  
  英文的可以  
  大家看一下  
  java.io.FileNotFoundException:   http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张立国/BPM_Tutorial.pdf  
   
  import   java.io.*;  
  import   java.net.*;  
  import   java.util.*;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
  public   class   testPDF   extends   HttpServlet{  
          public   void   init(ServletConfig   servletconfig)  
                  throws   ServletException  
          {  
                  super.init(servletconfig);  
   
   
          }  
   
  public   void   doPost(HttpServletRequest   req,  
  HttpServletResponse   res)  
  throws   ServletException,   IOException  
  {  
  ServletOutputStream   out   =res.getOutputStream   ();  
  res.setContentType(   "application/pdf"   );   //   MIME   type   for   pdf   doc  
  res.setHeader("Content-disposition","attachment;   filename="   +"BPM_Tutorial.pdf"   );  
  BufferedInputStream   bis   =   null;  
  BufferedOutputStream   bos   =   null;  
  try   {  
  URL   url   =   new   URL("http","127.0.0.1",8080,"/kyglxxxt/PROJECT/BPM_Tutorial.pdf");  
  bis   =   new   BufferedInputStream(url.openStream());  
  bos   =   new   BufferedOutputStream(out);  
  byte[]   buff   =   new   byte[2048];  
  int   bytesRead;  
  while(-1   !=   (bytesRead   =   bis.read(buff,   0,   buff.length)))  
  {  
  bos.write(buff,   0,   bytesRead);  
  }  
  }   catch(final   MalformedURLException   e)   {  
  System.out.println   (   "MalformedURLException."   );  
  throw   e;  
  }   catch(final   IOException   e)   {  
  System.out.println   (   "IOException."   );  
  throw   e;  
  }   finally   {  
  if   (bis   !=   null)  
  bis.close();  
  if   (bos   !=   null)  
  bos.close();  
  }  
  }  
  }  
   
  这样就显示正常,不过要谈出两个保存框(要是在jsp中直接使用超级连接,英文的直接就可以显示,没有保存况,所以说。。。。。。。这个方法也是没有用,写出来和那个中文的作个对比)  
  import   java.io.*;  
  import   java.net.*;  
  import   java.util.*;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
  public   class   testPDF   extends   HttpServlet{  
          public   void   init(ServletConfig   servletconfig)  
                  throws   ServletException  
          {  
                  super.init(servletconfig);  
   
   
          }  
   
  public   void   doPost(HttpServletRequest   req,  
  HttpServletResponse   res)  
  throws   ServletException,   IOException  
  {  
  ServletOutputStream   out   =res.getOutputStream   ();  
  res.setContentType(   "application/pdf"   );   //   MIME   type   for   pdf   doc  
  String   fileURL   ="http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/魏振钢/BPM_Tutorial.pdf";  
  res.setHeader("Content-disposition","attachment;   filename="   +"BPM_Tutorial.pdf"   );  
  BufferedInputStream   bis   =   null;  
  BufferedOutputStream   bos   =   null;  
  try   {  
  URL   url   =new   URL(fileURL);  
   
  bis   =   new   BufferedInputStream(url.openStream());  
  bos   =   new   BufferedOutputStream(out);  
  byte[]   buff   =   new   byte[2048];  
  int   bytesRead;  
  while(-1   !=   (bytesRead   =   bis.read(buff,   0,   buff.length)))  
  {  
  bos.write(buff,   0,   bytesRead);  
  }  
  }   catch(final   MalformedURLException   e)   {  
  System.out.println   (   "MalformedURLException."   );  
  throw   e;  
  }   catch(final   IOException   e)   {  
  System.out.println   (   "IOException."   );  
  throw   e;  
  }   finally   {  
  if   (bis   !=   null)  
  bis.close();  
  if   (bos   !=   null)  
  bos.close();  
  }  
  }  
  }  
   
  这样还是不行,错误是:java.io.FileNotFoundException:   http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张立国/BPM_Tutorial.pdf"  
   
   
     
  Top

26 楼liad()回复于 2003-09-23 22:39:38 得分 0

in   =   new   BufferedInputStream(new   FileInputStream("E:/Tomcat4.1/webapps/test/测试/文档.pdf"));  
  web.xml  
  =======  
      <servlet>  
          <servlet-name>PdfServlet</servlet-name>  
          <display-name>Pdf   Servlet</display-name>  
          <servlet-class>pdf.DispPDF</servlet-class>  
      </servlet>  
   
      <servlet-mapping>  
          <servlet-name>PdfServlet</servlet-name>  
          <url-pattern>/servlet/PdfServlet</url-pattern>  
      </servlet-mapping>  
   
  然后用http://localhost:8080/test/servlet/PdfServlet  
   
  我的完全可以,要不我也不会贴出代码  
  Top

27 楼lymkelly(柳叶眉)回复于 2003-09-23 22:40:48 得分 0

哎呀!@  
   
  错了  
  这样  
   
   
   
     
   
  我用的一个大虾的办法:  
  中文的不可以  
  英文的可以  
  大家看一下  
  java.io.FileNotFoundException:   http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张立国/BPM_Tutorial.pdf  
   
  import   java.io.*;  
  import   java.net.*;  
  import   java.util.*;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
  public   class   testPDF   extends   HttpServlet{  
          public   void   init(ServletConfig   servletconfig)  
                  throws   ServletException  
          {  
                  super.init(servletconfig);  
   
   
          }  
   
  public   void   doPost(HttpServletRequest   req,  
  HttpServletResponse   res)  
  throws   ServletException,   IOException  
  {  
  ServletOutputStream   out   =res.getOutputStream   ();  
  res.setContentType(   "application/pdf"   );   //   MIME   type   for   pdf   doc  
  res.setHeader("Content-disposition","attachment;   filename="   +"BPM_Tutorial.pdf"   );  
  BufferedInputStream   bis   =   null;  
  BufferedOutputStream   bos   =   null;  
  try   {  
  URL   url   =   new   URL("http","127.0.0.1",8080,"/kyglxxxt/PROJECT/BPM_Tutorial.pdf");  
  bis   =   new   BufferedInputStream(url.openStream());  
  bos   =   new   BufferedOutputStream(out);  
  byte[]   buff   =   new   byte[2048];  
  int   bytesRead;  
  while(-1   !=   (bytesRead   =   bis.read(buff,   0,   buff.length)))  
  {  
  bos.write(buff,   0,   bytesRead);  
  }  
  }   catch(final   MalformedURLException   e)   {  
  System.out.println   (   "MalformedURLException."   );  
  throw   e;  
  }   catch(final   IOException   e)   {  
  System.out.println   (   "IOException."   );  
  throw   e;  
  }   finally   {  
  if   (bis   !=   null)  
  bis.close();  
  if   (bos   !=   null)  
  bos.close();  
  }  
  }  
  }  
   
  这样就显示正常,不过要谈出两个保存框(要是在jsp中直接使用超级连接,英文的直接就可以显示,没有保存况,所以说。。。。。。。这个方法也是没有用,写出来和那个中文的作个对比)  
  import   java.io.*;  
  import   java.net.*;  
  import   java.util.*;  
  import   javax.servlet.*;  
  import   javax.servlet.http.*;  
  public   class   testPDF   extends   HttpServlet{  
          public   void   init(ServletConfig   servletconfig)  
                  throws   ServletException  
          {  
                  super.init(servletconfig);  
   
   
          }  
   
  public   void   doPost(HttpServletRequest   req,  
  HttpServletResponse   res)  
  throws   ServletException,   IOException  
  {  
  ServletOutputStream   out   =res.getOutputStream   ();  
  res.setContentType(   "application/pdf"   );   //   MIME   type   for   pdf   doc  
  String   fileURL   ="http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张立国/BPM_Tutorial.pdf";  
  res.setHeader("Content-disposition","attachment;   filename="   +"BPM_Tutorial.pdf"   );  
  BufferedInputStream   bis   =   null;  
  BufferedOutputStream   bos   =   null;  
  try   {  
  URL   url   =new   URL(fileURL);  
   
  bis   =   new   BufferedInputStream(url.openStream());  
  bos   =   new   BufferedOutputStream(out);  
  byte[]   buff   =   new   byte[2048];  
  int   bytesRead;  
  while(-1   !=   (bytesRead   =   bis.read(buff,   0,   buff.length)))  
  {  
  bos.write(buff,   0,   bytesRead);  
  }  
  }   catch(final   MalformedURLException   e)   {  
  System.out.println   (   "MalformedURLException."   );  
  throw   e;  
  }   catch(final   IOException   e)   {  
  System.out.println   (   "IOException."   );  
  throw   e;  
  }   finally   {  
  if   (bis   !=   null)  
  bis.close();  
  if   (bos   !=   null)  
  bos.close();  
  }  
  }  
  }  
   
  这样还是不行,错误是:java.io.FileNotFoundException:   http://127.0.0.1:8080/kyglxxxt/PROJECT/开发/2003/张立国/BPM_Tutorial.pdf"  
   
   
     
  Top

28 楼liad()回复于 2003-09-23 22:44:47 得分 0

还有一种方法就是使用  
  web.xml  
  =======  
      <servlet-mapping>  
          <servlet-name>PdfServlet</servlet-name>  
          <url-pattern>*.pdf</url-pattern>  
      </servlet-mapping>  
  pdf文件都使用PdfServlet去处理,不过DispPDF.java有所改变  
  这样直接在http://localhost:8080/test/abc.pdf,但是这种方法我没有试验成功中文路径的,request.getServletPath()还搞不定,正在调试Top

29 楼lymkelly(柳叶眉)回复于 2003-09-23 22:47:12 得分 0

to  
  :liad()   (    
  我觉得如果你的验证成功化的  
  我的就是目录有了问题  
  你要执行这个servlet   的话,  
  按照你的那个部署web.xml的部署  
   
    我可能就是中文的目录方错了地方了  
  我试用一下  
  用你刚才的  
  那个绝对路径的  
  in  
   
   
  Top

30 楼intelchen(intelchen)回复于 2003-09-23 22:54:21 得分 0

楼主我对那个BPM_Tutorial.pdf敢兴趣  
   
  能不能把这个文件发到intelchen@163.net?  
   
  你们做BMP的东西吗?Top

31 楼lymkelly(柳叶眉)回复于 2003-09-23 23:03:25 得分 0

感谢liad()   (  
  成功了  
  用你说的   绝对路经的那一个  
  !!!!!!!!  
  非常感谢!!!!!!!!  
   
   
  我明天在看一看就揭帖,谢谢  
   
  终于冲破了黑暗了!1  
  完成以后要好好的   研究一下这个地方  
  非常感谢Top

32 楼liad()回复于 2003-09-23 23:04:50 得分 0

如果你的tomcat已经转化为windows服务时,你可以通过  
  E:\Tomcat4.1\logs\stderr.log  
  E:\Tomcat4.1\logs\stdout.log  
  看到出错信息和控制台输出信息Top

33 楼lymkelly(柳叶眉)回复于 2003-09-24 08:37:32 得分 0

logs\目录下面没有stderr.log  
  stdout.log这两个文件,  
  只有类似  
   
  localhost_admin_log.2003-09-23.txt  
  的文件  
   
    liad()   大虾说的那个用*的,有没有解决中文问题呢  
   
  我原来对流这一块一窍不通,现在有了开始,  
  好好研究一下  
  Top

34 楼lymkelly(柳叶眉)回复于 2003-09-24 08:42:22 得分 0

to:intelchen(intelchen)  
    我给你发了Top

35 楼lymkelly(柳叶眉)回复于 2003-09-24 08:47:36 得分 0

liad()   (   )   大虾  
   
  words时不时  
  也可以用这种方式打开呢  
  现在我的问题是  
   
  一个目录下面好多文档  
  不同的扩展名  
  不知道怎样才能统一起来Top

36 楼liad()回复于 2003-09-24 13:34:35 得分 0

utf8encode.jsp  
  ==============  
  <%@   page   contentType="text/html;   charset=UTF8"   pageEncoding="gb2312"   %>  
  <HTML>  
  <HEAD>  
  <TITLE></TITLE>  
  </HEAD>  
  <BODY>  
  <p>  
  <%=   java.net.URLEncoder.encode("测试",   "UTF8")   %>  
  <p>  
  <%=   java.net.URLEncoder.encode("文档",   "UTF8")   %>  
  </BODY>  
  </HTML>  
   
  html页面输出  
  %E6%B5%8B%E8%AF%95    
   
  %E6%96%87%E6%A1%A3    
   
  然后用http://localhost:8080/test/%E6%B5%8B%E8%AF%95/%E6%96%87%E6%A1%A3.pdf  
  就可直接访问E:\Tomcat4.1\webapps\test\测试\文档.pdf,而不需要什么servlet来处理  
   
  由于使用了  
  <%@   page   contentType="text/html;   charset=UTF8"   pageEncoding="gb2312"   %>  
  所以在google输入关键字“测试”并提交,URL变成了  
  http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=%E6%B5%8B%E8%AF%95&btnG=Google+Search  
   
  而在baidu里面没有将charset设为UTF8  
  所以在其上面提交关键字“测试”后,URL为  
  http://www1.baidu.com/baidu?cl=3&tn=baidu&f=4&ct=0&lm=0&word=%B2%E2%CA%D4  
  Top

37 楼lymkelly(柳叶眉)回复于 2003-09-24 15:03:07 得分 0

liad()   (大虾  
  又有了新的进展了阿!!  
  太好了  
  我去试一试Top

38 楼lymkelly(柳叶眉)回复于 2003-09-24 15:33:00 得分 0

liad()   (大虾  
  我崇拜的不行了  
  哎呀  
  真是太厉害了!!!!!!!!!  
   
   
  Top

39 楼lymkelly(柳叶眉)回复于 2003-09-24 16:37:26 得分 0

liad()   (大虾  
  基本上解决了问题  
  但是呢   如国我的文件名  
  中有空格,  
  就会有问题  

原文地址:https://www.cnblogs.com/cy163/p/1299218.html