VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1351|回复: 13

利用struts实现下载,下载时中文文件名乱码的问题,已经尝试过编码转换,没有成功

[复制链接]

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-6 11:30:01 | 显示全部楼层 |阅读模式
ActionServlet中重写process,加了一行
request.setCharacterEncoding("GB2312");

action类中下载方法如下:
         private boolean download(String id,HttpServletRequest request,HttpServletResponse response){
                  // 设置响应头和下载保存的文件名

                 
                 response.reset();
                  response.setContentType("APPLICATION/OCTET-STREAM;charset=GB2312");
//                  try{
                  response.setHeader("Content-Disposition",
                  "attachment; filename=\"" +id + ".jar\"");
//                 }catch(UnsupportedEncodingException e){
//                         System.out.println(e);
//                 }
                  if(debug){
                         System.out.println("download at ");
                 }
                 boolean b = false;
                 DbConnection db = null;
                 Connection conn = null;
                 Statement st = null;
                 String sql = "select CONTENT from DIC_PLUGINS where id = '"+id+"'";
                 if(debug){
                         System.out.println(sql);
                 }
                 ResultSet rs = null;
                 Blob blob = null;
                 try{
                         db = new DbConnection();
                         db.openConnection();
                         conn = db.getConnection();
                         st = conn.createStatement();
                         rs = st.executeQuery(sql);
                         if(rs.next()){
                                 blob = rs.getBlob("CONTENT");
                         }
                 }catch(Exception e){
                         System.out.println(e);
                 }finally{
                         try{
                                 if(rs != null)
                                         rs.close();
                                 if(st!=null)
                                         st.close();
                                 if(conn != null)
                                         conn.close();
                                 if(db != null)
                                         db.close();
                                 }catch(Exception e){
                                         System.out.println(e);
                                 }
                         }
                 if(debug){
                         System.out.println("write");
                 }
                  // 写出流信息
                  if(blob!=null){
                          InputStream fileInputStream=null;
                          int size=0;
                          try{
                                  fileInputStream = blob.getBinaryStream();
                                  size = (int)blob.length();
                          }catch(SQLException e){
                                  System.out.println(e);
                          }
                  byte[] bytes = new byte[size];
//                  fileInputStream.read(bytes);
                  int i=0;
                 
                  if(debug){
                          System.out.println("last");
                  }
                  try{
                          while ((i=fileInputStream.read(bytes)) != -1) {
                                   response.getOutputStream().write(bytes,0,i);
                                  }
                                  
                                  fileInputStream.close();
                                  response.getOutputStream().flush();
                                  b = true;
                  }catch(Exception e){
                          System.out.println(e);
                  }
                  }
                 return b;
         }
回复

使用道具 举报

0

主题

63

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-3-26 13:45:02 | 显示全部楼层
response.setContentType("APPLICATION/OCTET-STREAM");
// try{
response.setHeader("Content-Disposition",
"attachment; filename=\"" + new String(id, request.getCharacterEncoding()) + ".jar\"");

如果没有记错的话
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-3-28 19:30:01 | 显示全部楼层
问题仍然存在,我修改的代码为
                 response.setContentType("APPLICATION/OCTET-STREAM");
                 
                  try{
                 response.setHeader("Content-Disposition","attachment; filename=\"" + new String(id.getBytes(),request.getCharacterEncoding()) + ".jar\"");
//                  response.setHeader("Content-Disposition",
//                  "attachment; filename=\"" +id + ".jar\"");
                 }catch(UnsupportedEncodingException e){
                         System.out.println(e);
                 }
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-3-28 23:45:01 | 显示全部楼层
而且request的编码输出为GB2312,但下载的就是乱码
回复

使用道具 举报

0

主题

63

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-3-29 18:45:02 | 显示全部楼层
sorry,反调了

String outFile = new String("啊啊啊啊啊啊啊啊.jar".getBytes(request.getCharacterEncoding()), "iso-8859-1");
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-4-2 14:00:01 | 显示全部楼层
乱码变化了,不过问题依旧,代码:
                 response.setContentType("APPLICATION/OCTET-STREAM");
                 
                  try{
                          String filename = new String((id+".jar").getBytes(request.getCharacterEncoding()),"iso-8859-1");
                 response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-4-7 10:30:01 | 显示全部楼层
其它编码呢 多试试
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-4-7 17:15:01 | 显示全部楼层
GBK什么的都试过了,以前不用struts时就是用iso-8859-1就可以,用struts改写了一下,却发现中文问题总也解决不了
回复

使用道具 举报

0

主题

63

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-9 14:15:01 | 显示全部楼层
我再试试看,刚才写了JSP,其中某个代码成功了,不过由于白吃IE缓存的原因,我一时想不起来是那段代码了
回复

使用道具 举报

0

主题

63

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-10 10:00:01 | 显示全部楼层
<%@ page pageEncoding="UTF-8" contentType="application/octet-stream" %>
<% String filename=java.net.URLEncoder.encode("你好", "UTF-8") + ".txt"; %>
<% response.setHeader("Content-Disposition", "attachment; filename=\""+ filename+ "\""); %>
<% out.write(65); out.write(66); %>
<% out.flush(); %>
<% System.out.println(new java.util.Date() + "/" + filename);%>

UTF-8是我这个测试用的,视你的需要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表