SSH框架网上商城项目第13战之Struts2文件上传功能
上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说。为此,这篇文章详细介绍一下Struts2实现文件上传的功能。
1.封装文件信息
我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件、文件类型和文件名。针对我们要传的图片,我们新建一个Model如下:
publicclassFileImage{ privateFilefile; privateStringcontentType; privateStringfilename; publicFilegetFile(){ returnfile; } publicStringgetContentType(){ returncontentType; } publicStringgetFilename(){ returnfilename; } publicvoidsetUpload(Filefile){//set方法可以不用和属性名一样,但是前台传进来时的参数得和set方法名相同。即前台传的参数为fileImage.upload this.file=file; } publicvoidsetUploadContentType(StringcontentType){ this.contentType=contentType; } publicvoidsetUploadFileName(Stringfilename){ this.filename=filename; } }
这样Model就写好了,考虑到文件上传的逻辑不是单个Action所特有的,所以我们将文件上传的逻辑写到工具类中,这样可供所有的Action调用。所以我们新建一个文件上传工具类(为了面向接口编程,我们也将工具类抽出个接口):
2.完成文件上传工具类
//文件上传工具类接口 publicinterfaceFileUpload{ //实现文件上传的功能,返回上传后新的文件名称 publicabstractStringuploadFile(FileImagefileImage); } //文件上传工具类具体实现 @Component("fileUpload") publicclassFileUploadUtilimplementsFileUpload{ privateStringfilePath; @Value("#{prop.filePath}") //@Value表示去beans.xml文件中找id="prop"的bean,它是通过注解的方式读取properties配置文件的,然后去相应的配置文件中读取key=filePath的值 publicvoidsetFilePath(StringfilePath){ System.out.println(filePath); this.filePath=filePath; } //1.通过文件名获取扩展名 privateStringgetFileExt(StringfileName){ returnFilenameUtils.getExtension(fileName); } //2.生成UUID随机数,作为新的文件名 privateStringnewFileName(StringfileName){ Stringext=getFileExt(fileName); returnUUID.randomUUID().toString()+"."+ext; } //实现文件上传的功能,返回上传后新的文件名称 @Override publicStringuploadFile(FileImagefileImage){ //获取新唯一文件名 Stringpic=newFileName(fileImage.getFilename()); try{ FileUtil.copyFile(fileImage.getFile(),newFile(filePath,pic));//第一个参数是上传的文件,第二个参数是将文件拷贝到新路径下 returnpic; }catch(Exceptione){ thrownewRuntimeException(e); }finally{ fileImage.getFile().delete(); } } }
上面有个@Value注解,是从properties文件中获取文件要存入的路径的,具体可参见:Spring获取配置文件信息。
3.在Action中注入封装文件类和工具类
写好了文件封装类和上传文件工具类后,我们需要将这两个对象注入到我们的Action中,这样就可以在Action中实现文件上传的功能了:
@Controller("baseAction") @Scope("prototype") publicclassBaseAction<T>extendsActionSupportimplementsRequestAware,SessionAware,ApplicationAware,ModelDriven<T>{ //封装了图片信息的类 protectedFileImagefileImage; //上传文件工具类 @Resource protectedFileUploadfileUpload; publicFileImagegetFileImage(){ returnfileImage; } publicvoidsetFileImage(FileImagefileImage){ this.fileImage=fileImage; } //省略其他无关代码…… }
4.实现文件的上传
好了,现在我们可以在ProductAction中去实现文件上传了,工具类写好的话,在Action中的代码量就很少了,这也是封装带来的优点。
@Controller("productAction") @Scope("prototype") publicclassProductActionextendsBaseAction<Product>{ //省略其他无关代码…… publicvoidsave()throwsException{ //fileUpload工具类被抽取了,uploadFile方法直接接受一个fileImage对象,返回新的图片名 Stringpic=fileUpload.uploadFile(fileImage); model.setPic(pic); model.setDate(newDate()); System.out.println(model); //商品信息入库 productService.save(model); } publicvoidupdate(){ Stringpic=fileUpload.uploadFile(fileImage); model.setPic(pic); model.setDate(newDate()); System.out.println(model); //更新商品 productService.update(model); } }
这样我们就完成了从前台上传文件的功能。
原文地址:http://blog.csdn.net/eson_15/article/details/51366384
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。