就是下载弹出对话框选择下载和直接打开,取消时候
点击直接打开中文出现乱码
如果下载完后打开就没事
不知道有没办法解决

解决方案 »

  1.   

    struts.xml
    <result name="success" type="streamx">
    <param name="contentType">application/vnd.ms-excel;charset=ISO8859-1</param>
    <param name="contentDisposition">attachment;filename="${fileName}"</param>
    <param name="inputName">inPutStream</param>
    <param name="bufferSize">4096</param>
    </result>action
    public InputStream getInPutStream() throws Exception { String filePath = (String) ActionContext.getContext().getSession().get(
    "filePath");
    String fileName = this.fileName; inputPath = (filePath + "/" + fileName).replace("\\", "/");
    File f = new File(inputPath);
    InputStream is = new FileInputStream(f); return is;
    }public String downLoadFiles() throws Exception { return "success"; }
      

  2.   

    三个地方配置编码
    1) JSP页面的pageEncoding="GBK",
    2) TOMCAT server.xml中的加入URIEncoding="GBK"
    3)struts常量 <constant name="struts.i18n.encoding" value="GBK" />contentType不需要配置
    这样就行了。<result name="download" type="stream">
    <param name="contentDisposition">
    attachment;filename="${newname}"
    </param>
    <param name="bufferSize">1024</param>
    <!--<param name="inputName">inputStream</param>-->
    </result>newname 为你Action中的成员变量
    方法名为getInputStream()<!--<param name="inputName">inputStream</param>-->可以不用配
      

  3.   

    因为我是在不知道文件名得前提下
    <param name="contentDisposition">attachment;filename="${fileName}"</param>
    <param name="inputName">inPutStream</param>
    filename我是在前台读出传到后台inputstream是我在action中配置获得文件路径的方法
      

  4.   

    就看struts.xml配置文件和action是没的问题的,你或得InputStream方法,好好检查下
    public InputStream getInputStream()
    {
    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("sheet1"); HSSFRow row = sheet.createRow(6);
    HSSFCell cell=null;
    HSSFCellStyle style = wb.createCellStyle();
    String[] str={"序号","姓","名","年龄"};
    for(int i=0;i<str.length;i++){
    cell = row.createCell((short)i);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(str[i]);
    }

    /* HSSFCell cell = row.createCell((short) 0);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue("序号"); cell = row.createCell((short) 1);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue("姓"); cell = row.createCell((short) 2);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue("名"); cell = row.createCell((short) 3);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue("年龄");
    */ List<User> list = this.findAll();
    System.out.println("# "+list); for (int i = 0; i < list.size(); ++i)
    {
    User user = list.get(i);
    row = sheet.createRow(i + 7); cell = row.createCell((short) 0);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(i + 1); cell = row.createCell((short) 1);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(user.getFirstname()); cell = row.createCell((short) 2);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(user.getLastname()); cell = row.createCell((short) 3);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(user.getAge());
    }
    //利用流体得到内存中数据的方法一
    /* String fileName = MakeRandomString.RandomString1(10);
    fileName = new StringBuffer(fileName).append(".xls").toString();
    final File file = new File(fileName); try
    {
    OutputStream os = new FileOutputStream(file);
    wb.write(os);
    os.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } InputStream is = null;
    try
    {
    is = new FileInputStream(file);
    }
    catch (FileNotFoundException e)
    {
    e.printStackTrace();
    } new Thread(new Runnable() {
    public void run() {
    try {
    Thread.sleep(15000);
    file.delete();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    ).start();
    return is;

    */

    //利用流体得到内存中数据的方法二
    ByteArrayOutputStream os=new ByteArrayOutputStream(1024);
    try {
    wb.write(os);
    } catch (IOException e) {
    e.printStackTrace();
    }


    /* byte[] b=wb.getBytes();//此方法仅仅只获得HSSFWorkbook中部分的字符
    System.out.println(b);
    InputStream is=new ByteArrayInputStream(b);
    */
    byte[] b=os.toByteArray();
    System.out.println(b);
    InputStream is=new ByteArrayInputStream(b);
    return is;
    }
    }Action:
    public InputStream getDownloadFile()
    {
    return this.service.getInputStream();
    }struts。xml配置文件:
    <action name="generateExcel" class="generateExcelAction">
    <result name="success" type="stream">//你这里估计笔误
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename="AllUsers.xls"</param>
    <param name="inputName">downloadFile</param>//红色部分和Action中的getDownloadFile()方法名相互对应的,遵循javabean规范,注意大小写
    </result>
    </action>