你的位置:首页 > Java教程

[Java教程]Struts2文件上传下载补充问题


  上回书说到strust2的文件上传下载,上次是把文件上传上去了,然后傻傻的在数据库中存入了一个绝对路径,在本机上测试取图片的时候各种好使,小小的嘚瑟了一下,觉得文件上传下载不过如此嘛,但是今天,就在今天把项目打包成WAR包运行的时候各种找不到图片,我呢个郁闷啊,开始还以为是打包的时候出问题了,但是又重新打包运行还是不行,后来去看数据库才知道了是上传路径的问题,本机的tomcat是装在d盘,但是打的war包运行的环境tomcat是装在c盘,所以找不到路径了,那么在显示的时候肯定是有问题的:

  文件上传的时候需要给出上传路径,这时候的路径是绝对路径,但是往数据库中存的时候需要存相对路径:

  

//得到工程保存图片的路径    String root = ServletActionContext.getServletContext().getRealPath("/ima");     File destFile = new File(root);     //如果不存在就创建     if (!destFile.exists()) {       destFile.mkdirs();      }     InputStream is = new FileInputStream(ima);     //把图片写入到上面设置的路径里     OutputStream os = new FileOutputStream(destFile+ "\\"+imaFileName);     try {        byte[] b = new byte[1024];// 每次写入的大小        int j = 0;        while ((j = is.read(b)) > 0) {          os.write(b, 0, j);        }      } catch (Exception e) {        e.printStackTrace();      } finally {        is.close();        os.close();      }

上面代码中的root是绝对路径,绝对路径是什么意思呢?比如说D:\Tomcat 6.0\webapps这就是一个绝对路径,那什么是相对路径呢?Tomcat 6.0\webapps就是一个相对路径,切记相对路径最前面是没有斜线的哦。上传文件时候是相对路径,但是在存入数据库中的时候却要存入相对路径,怎么办?如下:

 String fileUrl="ima"+"\\"+imaFileName;     sysUser.setImgUrl(fileUrl);

这样得到的就是一个相对路径,中间的\\是为了转译\。

  数据库存入的相对路径在下载文件的时候也是个麻烦,最少对我是个麻烦,因为下载的时候从数据库查到的是相对路径,你还需要把相对路径还原成绝对路径,不然这哥们儿不搭理你啊,你肯定取不到这个文件。

取文件跟路径以前使用的都是request.getRealPath(path);但是这哥们儿现在不好使了,也不能说不好使了,就是老了该休息休息了,所以换新的来了,新的方法是:

request.getSession().getServletContext().getRealPath(path);

只需要把path换成你的相对路径就可以找到这个文件了,然后下载的话就是一个I\O流的事了。

  String path=request.getSession().getServletContext().getRealPath("ima\\"+imgName);         File file = new File(path);    // 以流的形式下载文件。     InputStream fis = new BufferedInputStream(new FileInputStream(path));     byte[] buffer = new byte[fis.available()];     fis.read(buffer);     fis.close();     // 清空response     response.reset();     // 设置response的Header     response.setContentType("application/x-download");     response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(imgName,"utf-8"));     response.addHeader("Content-Length", "" + file.length());     OutputStream toClient = response.getOutputStream();     toClient.write(buffer);     toClient.flush();     toClient.close();

恩,暂时就这样了。