使用Struts2上传文件过程中遇到的一个问题

背景:项目中涉及到表单数据提交,其中还包含有图片。

关于如何保存图片,我一开始有两种思路:

  1. 将图片转换成二进制字节流,然后保存到数据表当中(项目中用的是Oracle数据库,保存二进制字节流的那个字段定义成blob类型就可以了)。
  1. 将图片上传到服务器,然后数据表中保存的是文件名(如 eakon.jpg)。只保存文件名是出于这样的考虑:因为现在只给我们项目组分配了一台服务器,以后图片可能要放到专门的文件服务器上,如果现在把路径也保存到数据表当中去的话我怕到时候万一项目的部署方式一改就会牵扯到很多东西,所以就直接保存个文件名。如果要将图片展示在前台页面上的话,就在业务层拼接一下绝对路径/相对路径。

一开始我选择了第一种方式,即将图片转换成二进制字节流编码然后存到数据表的大数据字段当中去,后来也是考虑到项目后期部署的问题,以及图片展示的问题--------假如要将图片展现在前台页面,首先要将该图片对应的存储在数据表中二进制数据取出来,取出来之后还要涉及到一系列的数据格式转换问题。因为不能直接将二进制数据直接传到jsp页面,在此之前还要对其进行处理。觉得比较麻烦,所以后来选择了第二种方式来对图片进行上传的操作。

一开始在Action中老是获取不到上传的文件,一时不知道是什么原因。后来把图片上传涉及到的代码重新检查了一下,然后修改了一下拦截器又能上传图片了,暂时没找到原因在哪里。先总结一下在上传文件(这里只针对图片文件,其他文件可能还涉及到设置编码字符集的问题,以后遇到了再总结)的过程中需要注意的地方。

我这里用的是jsp表单提交的方式,没有使用Ajax

jsp页面里面需要注意的地方:

  1. 在form标签中 enctype 属性应该设置为 "multipart/from-data"
  1. 文件域的name和后台Action中接收文件的变量名要一致
  2. 提交按钮应为 submit 标签

Struts2配置时需要注意的地方
一定要配置一个属性指定文件存放的临时目录。如果是使用xml文件进行配置的话,需在Struts.xml文件中进行如下配置:

指定文件存放的临时目录

关于拦截器
我是在action标签中嵌了一个拦截器,最好是用<interceptor-ref name="" class="" ></interceptor-ref>的方式定义拦截器然后添加到拦截器栈里面去,需要用的时候再到action里面引用比较好,可以做到代码复用

定义一个上传图片的拦截器

如果使用Struts2进行文件上传,还要记得把这个两个jar包引进来

关于处理文件上传的Action

  1. 需要定义一个File类型的变量来接收从前台传过来的文件(其实文件从前台传过来之后,会保存在我们定义的临时存放目录里面,然后在完成了Action中对应的方法之后系统会把临时目录里面的临时文件给清除)。
  1. 比如说 File 类型的变量名字为 File eakon。我们可以再定义三个String类型的变量,分别为 title, eakonFileName, eakonContentType。可以获取到 文件标题、文件名以及文件的类型(必须引入上面的两个jar包,并且按照 文件类型变量名+FileName, 文件类型变量名+ContentType才能获取到文件名以及文件类型)。但是要记得生成对应的get/set方法。

只要注意以上几点,上传图片的功能基本就能实现了(有一些具体的业务代码就不贴了,只贴一个主要的函数)。

在前台页面输入需要提交的信息:


企业营业执照扫描件为需要上传的图片,上传之后会使用企业营业执照编号作为文件名

点击保存之后触发对应的action,在调用对应的Action中的函数之前,首先会被拦截器拦截,判断上传的文件类型以及大小是否符合定义的要求,如果符合,那就进入对应的method进行处理。

下面这个函数的功能就是将临时目录下面的文件里面的内容复制到指定路径下的文件当中

@Override
    /*将文件保存到路径为fileName的地方,其中fileName包括了文件名以及路径
     * @param file 从前台获取到的文件
     * @param filePath 路径+文件名
     * */
private static final int BUFFER_SIZE = 16*1024;//文件缓冲区大小
public void copyAndSaveFile(File file,String filePath) throws IOException{
        File dst = new File(filePath);
        InputStream in = null;
        OutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(file),BUFFER_SIZE);
            out = new BufferedOutputStream(new FileOutputStream(dst),BUFFER_SIZE);
            byte[] buffer = new byte[BUFFER_SIZE];
            int len = 0;
            while( (len=in.read(buffer)) > 0){
                out.write(buffer, 0, len);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(null != in){
                try{
                    out.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

经过上述处理,文件已经保存到了目标文件夹下面:

文件已经保存到了指定目录

在数据表中的对应字段,只保存了文件名:

数据表对应字段保存的是文件名(不带路径)

如果需要将图片在前台页面显示出来,只需取出对应的文件名,然后加上访问路径传到前台 img 标签的src属性即可


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容