转自: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 }

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

【SSH网上商城项目实战13】Struts2实现文件上传功能的更多相关文章

  1. 【SSH网上商城项目实战12】添加和更新商品功能的实现

    转自: https://blog.csdn.net/eson_15/article/details/51366370 添加商品部分原理和添加商品类别是一样的,不过要比商品类别复杂,因为商品的属性有很多 ...

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

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

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

    转自:https://blog.csdn.net/eson_15/article/details/51360804 在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做 ...

  4. 【SSH网上商城项目实战30】项目总结

      转自:https://blog.csdn.net/eson_15/article/details/51479994 0. 写在前面 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了 ...

  5. 【SSH网上商城项目实战30】项目总结(附源码下载地址)

    项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...

  6. 【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布

     转自:https://blog.csdn.net/wwww_com/article/details/54405355 前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响 ...

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

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

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

         转自: https://blog.csdn.net/eson_15/article/details/51447492 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后, ...

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

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

随机推荐

  1. 洛谷P5282 【模板】快速阶乘算法(多项式多点求值+MTT)

    题面 传送门 前置芝士 \(MTT\),多项式多点求值 题解 这题法老当初好像讲过--而且他还说这种题目如果模数已经给定可以直接分段打表艹过去 以下是题解 我们设 \[F(x)=\prod_{i=0} ...

  2. 2018 ACM-ICPC 亚洲区域赛北京现场赛 I题 Palindromes

    做法:打表找规律 大数是过不了这个题的(但可以用来打表) 先找k的前缀,前缀对应边缘数字是哪个 如果第0位是2-9 对应奇数长度的1-8 第0位为1时,第1位为0时对应奇数长度的9,为1-9时对应偶数 ...

  3. sublime text 显示 typescript高亮

    用ionic angular2写东西,还是用我的sublime 发现ts文件不识别,没有高亮.搜呗. 搜索出来的博客地址:http://www.cnblogs.com/happen-/p/638553 ...

  4. ElasticSearch5.0——IK词库加载

    Dictionary ConfigurationIKAnalyzer.cfg.xml can be located at {conf}/analysis-ik/config/IKAnalyzer.cf ...

  5. canvas图像绘制过程中的注意

    特别来记录一下canvas绘制图像,要在图片加载完后,才会将其显示在canvas画布之上,否则会显示不出来:深刻体会,愣是找不到问题... var c=document.getElementById( ...

  6. node.js常用命令

    安装node 验证是否安装node $node -v $npm -v npm node package manager , Node 的包管理器 安装 包 # 安装到当前目录 $ npm instal ...

  7. 任务调度SpringTask

    一.什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的任务调度框架有Quartz和Spri ...

  8. EDEM 2018 + Fluent 19.0耦合

    具体步骤参考流沙的文章即可,如果python版本较高,可能有个地方需要小小的改动一下: tools文件夹下的compile_lib_edem_coupling.py文件中,导入模块有个地方需要修改 其 ...

  9. java获取某段时间内的月份列表

    /**获取两个时间节点之间的月份列表**/ private static List<String> getMonthBetween(String minDate, String maxDa ...

  10. header请求头信息详细介绍

    https://www.byvoid.com/zhs/blog/http-keep-alive-header HTTP协议头部与Keep-Alive模式详解 1.什么是Keep-Alive模式? 我们 ...