【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")
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);
	}
}

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

 

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

      整个项目的源码下载地址:http://blog.csdn.net/eson_15/article/details/51479994

      文末福利:“程序员私房菜”,一个有温度的公众号~ 
        程序员私房菜

_____________________________________________________________________________________________________________________________________________________

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

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

 

 

 

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值