SSH框架网上商城项目第13战之Struts2文件上传功能

网友投稿 180 2023-07-15


SSH框架网上商城项目第13战之Struts2文件上传功能

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说。为此,这篇文章详细介绍一下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")

publnVVSyLigsic 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 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDrivnVVSyLigsen {

//封装了图片信息的类

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 {

//省略其他无关代码……

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);

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈bootstrap源码分析之scrollspy(滚动侦听)
下一篇:Java一些常见的出错异常处理方法总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~