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();

恩,暂时就这样了。

 

你可能感兴趣的:(struts2)