servlet做的文件下载功能,弹出对话框,能保存成功,但是打开不对。比如:点击test.log,弹出对话框,点“打开”,打开的是test[1].log,并且内容为空。

解决方案 »

  1.   

    又试了:点击‘打开’报错:找不到C:\Documents and Settings\fz\Local Settings\Temporary Internet Files\Content.IE5\S1QBOLU7\test[1].txt
    是不是我的系统有问题啊
      

  2.   

    代码:
    public class ControllerServlet extends HttpServlet {

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { 
    try{
    request.setCharacterEncoding("gb2312"); 
    String fileName = "temp.txt";
    String filePath = "e:/temp/temp.txt";
    File f = new File(filePath);
    int length = (int)f.length();
    int size = length/64;

    response.setContentType("text/plain");
    String s = "attachment;filename="+fileName; 
    response.setHeader("Content-Disposition",s);         ServletOutputStream out = response.getOutputStream();
            int startIndex = 0;
            for(int i = 0;i<=size;i++){
             Object[] params = new Object[3];
    params[0] = filePath;
    params[1] = new Integer(startIndex);
    params[2] = new Integer(64);
    String[] signature = new String[3];
    signature[0] = "java.lang.String";
    signature[1] = "java.lang.Integer";
    signature[2] = "java.lang.Integer";
             byte[] ret = (byte[])this.downLoadFile(filePath,new Integer(startIndex) , new Integer(64));
            out.write(ret);         startIndex = (i+1)*64;
            }
            out.close();
    }catch(Throwable e){
    //logger.error("下载文件出错", e);
    } } 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
    doProcess(request, response);
    }
    private byte[] downLoadFile(String fileName,Integer beginIndex,Integer size){
     
     RandomAccessFile raf = null;
     try{
     File f = new File(fileName);

     raf= new RandomAccessFile(f,"r");
     int length = (int)f.length();

     if(beginIndex.intValue()+size.intValue()>length){
     byte[] ret = new byte[length-beginIndex.intValue()];
     raf.seek(beginIndex.intValue());
                 raf.read(ret);
                 return ret;
     }else{
     byte[] ret = new byte[size.intValue()];
                 raf.seek(beginIndex.intValue());
                 raf.read(ret);
             return ret;
     }  
     }catch(IOException e) {
                e.printStackTrace();
                return null;
         } finally {
             try {
             if (raf != null) {
              raf.close();
             }
             }catch (Exception e) {
              e.printStackTrace();
             }
            }  }}