请教高人:在Download文件下载后,怎样删除存放在服务器上的临时文件??

解决方案 »

  1.   


    我曾经用php做过这个。。
    那个文件属性啥的一定要改好。。否则删不掉。。
      

  2.   

    具体情形是这样的:
    从DB读取数据,在服务器导出Excel临时文件,download到客户端后,删除服务器上生成的那个临时Excel文件。
    前面的操作现在都没有问题了(虽然还有不足),就是删除临时文件的操作,不知怎样来操作。
    protected StreamInfo getStreamInfo(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {

    // 源文件路径
    srcFilePath = servlet.getInitParameter("file-upload");

    // 生成Excel文件
    File file = createExcel();
    System.out.println(file.getAbsolutePath()); // 设置下载新的文件名
    String newFileName = Constants.FILE_NAME
    + CommonUtils.getDateFormat(Constants.DATE_YMDH24MS) + ".xls";
    newFileName = new String(newFileName.getBytes("gbk"), "iso-8859-1");

    // 设置方式:附件
    response.setHeader("Content-disposition", "attachment; filename=" + newFileName);

    // 设定下载文件类型
    FileStreamInfo si = new FileStreamInfo("application/vnd.ms-excel", file); return si;
    }
    这是download的代码,如果在这个方法的return前使用file.delete()的话,会报文件不存在的错误,就是说还没有提示客户下载就已经将源文件删除了。
      

  3.   

    兄弟,我非常同意你的这种想法,我也尝试过,但是FileStreamInfo这个对象必须传一个File对象给她,如果是流的就好了,你有什么好办法吗?
      

  4.   

    我们的项目没有用Structs框架,所以可以直接在jsp中设置header,然后将文件写入输出流,
    不需要FileStreamInfo对象。按你的情况可能你只能按人家的规矩来了。这样的话这个思路你
    看是否可行.
    1.将生成的下载文件统一放到一特定目录。
    2.文件名称加上时间前缀
    3.用以特定线程最为GC,每隔一段时间扫描下目录将时间前缀与当前系统时间之差大于指定
      时间间隔的文件作为垃圾文件删除这样你的程序就不要考虑临时文件删除的问题了,就像Java中不用考虑内存的问题一样,
    但弊端也是有的。如果你的站点访问量大的话可能垃圾文件一个时间间隔的文件增加
    也是很客观的。而且由于判断垃圾文件的方法比较简单,可能造成一个比较大的文件
    正在下载中却被当做垃圾删掉。所以这个办法是万不得已的办法,只能你的文件下载代码
    允许你修改,尽量修改代码来解决问题
      

  5.   

    不要用FileStreamInfo,方法还是很多的
    1.从action跳转到jsp/servlet中去做下载
    2.在action中直接用response向浏览器输出字节流,然后return null