转自:https://blog.csdn.net/eson_15/article/details/51366384

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说。为此,这篇文章详细介绍一下Struts2实现文件上传的功能。

1. 封装文件信息
        我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件、文件类型和文件名。针对我们要传的图片,我们新建一个Model如下:

 1 public class FileImage {
 2     private File file;
 3     private String contentType;
 4     private String filename;
 5
 6     public File getFile() {
 7         return file;
 8     }
 9
10     public String getContentType() {
11         return contentType;
12     }
13
14     public String getFilename() {
15         return filename;
16     }
17
18     public void setUpload(File file) { //set方法可以不用和属性名一样,但是前台传进来时的参数得和set方法名相同。即前台传的参数为fileImage.upload
19         this.file = file;
20     }
21
22     public void setUploadContentType(String contentType) {
23         this.contentType = contentType;
24     }
25
26     public void setUploadFileName(String filename) {
27         this.filename = filename;
28     }
29 }

这样Model就写好了,考虑到文件上传的逻辑不是单个Action所特有的,所以我们将文件上传的逻辑写到工具类中,这样可供所有的Action调用。所以我们新建一个文件上传工具类(为了面向接口编程,我们也将工具类抽出个接口):

2. 完成文件上传工具类

 1 //文件上传工具类接口
 2 public interface FileUpload {
 3
 4     //实现文件上传的功能,返回上传后新的文件名称
 5     public abstract String uploadFile(FileImage fileImage);
 6
 7 }
 8
 9 //文件上传工具类具体实现
10 @Component("fileUpload")
11 public class FileUploadUtil implements FileUpload {
12
13     private String filePath;
14     @Value("#{prop.filePath}")
15     //@Value表示去beans.xml文件中找id="prop"的bean,它是通过注解的方式读取properties配置文件的,然后去相应的配置文件中读取key=filePath的值
16     public void setFilePath(String filePath) {
17         System.out.println(filePath);
18         this.filePath = filePath;
19     }
20
21     //1. 通过文件名获取扩展名
22     private String getFileExt(String fileName) {
23         return FilenameUtils.getExtension(fileName);
24     }
25
26     //2. 生成UUID随机数,作为新的文件名
27     private String newFileName(String fileName) {
28         String ext = getFileExt(fileName);
29         return UUID.randomUUID().toString() + "." + ext;
30     }
31
32     //实现文件上传的功能,返回上传后新的文件名称
33     @Override
34     public String uploadFile(FileImage fileImage) {
35         //获取新唯一文件名
36         String pic = newFileName(fileImage.getFilename());
37         try {
38             FileUtil.copyFile(fileImage.getFile(), new File(filePath, pic));//第一个参数是上传的文件,第二个参数是将文件拷贝到新路径下
39             return pic;
40         } catch (Exception e) {
41             throw new RuntimeException(e);
42         } finally {
43             fileImage.getFile().delete();
44         }
45     }
46 }

上面有个@Value注解,是从properties文件中获取文件要存入的路径的,具体可参见:Spring获取配置文件信息 。

3. 在Action中注入封装文件类和工具类
        写好了文件封装类和上传文件工具类后,我们需要将这两个对象注入到我们的Action中,这样就可以在Action中实现文件上传的功能了:

 1 @Controller("baseAction")
 2 @Scope("prototype")
 3 public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {
 4
 5     //封装了图片信息的类
 6     protected FileImage fileImage;
 7
 8     //上传文件工具类
 9     @Resource
10     protected FileUpload fileUpload;
11
12     public FileImage getFileImage() {
13         return fileImage;
14     }
15     public void setFileImage(FileImage fileImage) {
16         this.fileImage = fileImage;
17     }
18     //省略其他无关代码……
19 }

4. 实现文件的上传

好了,现在我们可以在ProductAction中去实现文件上传了,工具类写好的话,在Action中的代码量就很少了,这也是封装带来的优点。

 1 @Controller("productAction")
 2 @Scope("prototype")
 3 public class ProductAction extends BaseAction<Product> {
 4
 5         //省略其他无关代码……
 6
 7     public void save() throws Exception {
 8         //fileUpload工具类被抽取了,uploadFile方法直接接受一个fileImage对象,返回新的图片名
 9         String pic = fileUpload.uploadFile(fileImage);
10
11         model.setPic(pic);
12         model.setDate(new Date());
13         System.out.println(model);
14         //商品信息入库
15         productService.save(model);
16     }
17
18     public void update() {
19         String pic = fileUpload.uploadFile(fileImage);
20         model.setPic(pic);
21         model.setDate(new Date());
22         System.out.println(model);
23         //更新商品
24         productService.update(model);
25     }
26 }

这样我们就完成了从前台上传文件的功能。

转载于:https://www.cnblogs.com/sharpest/p/9850157.html

【SSH网上商城项目实战13】Struts2实现文件上传功能相关推荐

  1. 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断

    转自:https://blog.csdn.net/eson_15/article/details/51425010 上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登 ...

  2. 【SSH网上商城项目实战11】查询和删除商品功能的实现

    在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做了,原理和第8节一模一样,只是修改一些参数,比如请求不同的action等.由于查询和删除商品不需要弹出新的UI窗口, ...

  3. 【SSH网上商城项目实战】之环境搭建填坑

    此篇主要是记录我在从零开始走一遍倪升武大神的[SSH网上商城项目实战]过程中遇到的一些坑并记录解决方法.关于这个项目,大家可以去倪升武的博客学习了解,SSH网上商城项目实战请戳倪升武的项目实战专题. ...

  4. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

    转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...

  5. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

  6. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2

    转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...

  7. 【SSH网上商城项目实战20】在线支付平台的介绍

    之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容, ...

  8. 【SSH网上商城项目实战07】Struts2和Json的整合

    上一节我们完成了DataGrid显示jason数据,但是没有和后台联系在一起,只是单纯地显示了我们自己弄的json数据,这一节我们将json和Struts2整合,打通EasyUI和Struts2之间的 ...

  9. 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架

    转自:https://blog.csdn.net/eson_15/article/details/51312490 前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基 ...

  10. 【SSH网上商城项目实战23】完成在线支付功能

    转自:https://blog.csdn.net/eson_15/article/details/51464415 上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点 ...

最新文章

  1. SVN冲突出现原因及解决方法浅谈
  2. Android 动画分析学习笔记
  3. python简单工厂模式_简单工厂模式-python语言实现
  4. mysql redis hbase_MySQL之基本介绍
  5. 数据库缓冲池_块缓冲| 数据库管理系统
  6. ArcGIS客户端开发学习笔记(二)——XML
  7. JAVA常见算法题(二十五)
  8. opnet安装的问题
  9. 开源免费CRM云端的客户管理系统SuiteCRM简介
  10. 三维向量的一些运算技巧,如何计算坐标
  11. 四月,诗月,你是最美人间四月天。
  12. IBM服务器RAID5
  13. Qt ui 到底是什么?
  14. Maven 上手指南
  15. 华为系统云服务器地址,华为系统云服务器地址
  16. s3c2440 uboot 移植 (四)支持环境变量在nandflash 存储
  17. TinyOS总体介绍
  18. JetBrains公司旗下开发工具简介
  19. linux常用端口查询
  20. 哈希函数——SHA1

热门文章

  1. __proto__和prototype 小记
  2. axios.js post 后台木有数据
  3. JS中的数组排序函数sort()
  4. javascript笔记——js面试问题
  5. 细谈会话管理-----Cookie和Session
  6. 写, 读sdcard目录上的文件
  7. uploadify 3.1 /3.2 在Firefox,Chrome 浏览器下,进入页面请求两次问题解决办法。
  8. TreeMap按照key排序
  9. AMQ学习笔记 - 16. 确认机制的测试
  10. bzoj 1009: [HNOI2008]GT考试