SSH框架网上商城项目第13战之Struts2文件上传功能
程序员文章站
2024-03-12 08:42:44
上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说。为此,这篇文章详细介绍一下struts2实现文件上传的功能。
1. 封装文件信息...
上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说。为此,这篇文章详细介绍一下struts2实现文件上传的功能。
1. 封装文件信息
我们首先得有一个model来封装文件的信息,这个model里需要有三个属性:文件、文件类型和文件名。针对我们要传的图片,我们新建一个model如下:
public class fileimage { private file file; private string contenttype; private string filename; public file getfile() { return file; } public string getcontenttype() { return contenttype; } public string getfilename() { return filename; } public void setupload(file file) { //set方法可以不用和属性名一样,但是前台传进来时的参数得和set方法名相同。即前台传的参数为fileimage.upload this.file = file; } public void setuploadcontenttype(string contenttype) { this.contenttype = contenttype; } public void setuploadfilename(string filename) { this.filename = filename; } }
这样model就写好了,考虑到文件上传的逻辑不是单个action所特有的,所以我们将文件上传的逻辑写到工具类中,这样可供所有的action调用。所以我们新建一个文件上传工具类(为了面向接口编程,我们也将工具类抽出个接口):
2. 完成文件上传工具类
//文件上传工具类接口 public interface fileupload { //实现文件上传的功能,返回上传后新的文件名称 public abstract string uploadfile(fileimage fileimage); } //文件上传工具类具体实现 @component("fileupload") public class fileuploadutil implements fileupload { private string filepath; @value("#{prop.filepath}") //@value表示去beans.xml文件中找id="prop"的bean,它是通过注解的方式读取properties配置文件的,然后去相应的配置文件中读取key=filepath的值 public void setfilepath(string filepath) { system.out.println(filepath); this.filepath = filepath; } //1. 通过文件名获取扩展名 private string getfileext(string filename) { return filenameutils.getextension(filename); } //2. 生成uuid随机数,作为新的文件名 private string newfilename(string filename) { string ext = getfileext(filename); return uuid.randomuuid().tostring() + "." + ext; } //实现文件上传的功能,返回上传后新的文件名称 @override public string uploadfile(fileimage fileimage) { //获取新唯一文件名 string pic = newfilename(fileimage.getfilename()); try { fileutil.copyfile(fileimage.getfile(), new file(filepath, pic));//第一个参数是上传的文件,第二个参数是将文件拷贝到新路径下 return pic; } catch (exception e) { throw new runtimeexception(e); } finally { fileimage.getfile().delete(); } } }
上面有个@value注解,是从properties文件中获取文件要存入的路径的,具体可参见:spring获取配置文件信息 。
3. 在action中注入封装文件类和工具类
写好了文件封装类和上传文件工具类后,我们需要将这两个对象注入到我们的action中,这样就可以在action中实现文件上传的功能了:
@controller("baseaction") @scope("prototype") public class baseaction<t> extends actionsupport implements requestaware,sessionaware,applicationaware,modeldriven<t> { //封装了图片信息的类 protected fileimage fileimage; //上传文件工具类 @resource protected fileupload fileupload; public fileimage getfileimage() { return fileimage; } public void setfileimage(fileimage fileimage) { this.fileimage = fileimage; } //省略其他无关代码…… }
4. 实现文件的上传
好了,现在我们可以在productaction中去实现文件上传了,工具类写好的话,在action中的代码量就很少了,这也是封装带来的优点。
@controller("productaction") @scope("prototype") public class productaction extends baseaction<product> { //省略其他无关代码…… public void save() throws exception { //fileupload工具类被抽取了,uploadfile方法直接接受一个fileimage对象,返回新的图片名 string pic = fileupload.uploadfile(fileimage); model.setpic(pic); model.setdate(new date()); system.out.println(model); //商品信息入库 productservice.save(model); } public void update() { string pic = fileupload.uploadfile(fileimage); model.setpic(pic); model.setdate(new date()); system.out.println(model); //更新商品 productservice.update(model); } }
这样我们就完成了从前台上传文件的功能。
原文地址:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。