开发者社区> ghost丶桃子> 正文

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

简介:
+关注继续查看

目录(?)[+]

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

1. 封装文件信息

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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. 完成文件上传工具类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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中实现文件上传的功能了:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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中的代码量就很少了,这也是封装带来的优点。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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. }  
       这样我们就完成了从前台上传文件的功能。


     (注:到最后我会提供整个项目的源码下载!欢迎大家收藏或关注)

       相关阅读:http://blog.csdn.net/column/details/str2hiberspring.html

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【蓝桥Java每日一题】——12.可获得的最大点数
今天给大家带来一道前缀和的练手题目。前缀和虽然不是动规那么复杂的知识点,但是还是有很多坑的,掌握好对我们还是有很大的帮助的,是一种非常基础的算法,大家一定要掌握。
5 0
【蓝桥Java每日一题】——13.仅仅反转字母
【蓝桥Java每日一题】——13.仅仅反转字母
4 0
【蓝桥Java每日一题】——14.球会落何处(有趣模拟题)
【蓝桥Java每日一题】——14.球会落何处(有趣模拟题)
6 0
数据中台为什么不好搞?
数据中台落地的关键在于计算引擎,而计算引擎需要具备独立且完备的计算能力、应对多样性数据源的开放性、开发的高效性以应对不停变化的前台需求。
5 0
【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可(上)
【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可
7 0
【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡)(中)
【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡)
5 0
GAN对抗网络入门教程
A Beginner's Guide to Generative Adversarial Networks (GANs) https://skymind.ai/wiki/generative-adversarial-network-gan
4 0
Linux命令汇总 | vim | shell | 进阶【2022版】
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布。 它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。 Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE等。
5 0
1955
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载