struts2文件上传 下载

来源:互联网 发布:跨境电子商城源码 编辑:程序博客网 时间:2024/06/11 23:31

多文件上传的要求

    

1:完成文件上传

  1:将上传的文件统一放置到upload的文件夹下

  2:将每天上传的文件,使用日期格式的文件夹分开,将每个业务的模块放置统一文件夹下

  3:上传的文件名要指定唯一,可以使用UUID的方式,也可以使用日期作为文件名

  4:封装一个文件上传的方法,该方法可以支持多文件的上传,即支持各种格式文件的上传

  5:保存路径path的时候,使用相对路径进行保存,这样便于项目的可移植性

第一步:在util包下封装一个方法:

public static String fileUploadReturnPath(File upload, String uploadFileName,String model) {//获取upload的文件夹String basepath = ServletActionContext.getServletContext().getRealPath("/upload");//指定日期格式的文件夹(yyyy/MM/dd)String datepath = DateUtils.dateToString(new Date());//文件后缀String perfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));//文件名(格式:ADFSDFSDFA@#$@#$@DSDFS12321.doc)String filename = UUID.randomUUID().toString()+perfix;//判断当前日期文件夹是否存在,如果不存在,创建一个日期的文件夹String modelPath = basepath+datepath+model;File dateFile = new File(modelPath);if(!dateFile.exists()){dateFile.mkdirs();}//目标文件File destFile = new File(modelPath+"/"+filename);//文件上传upload.renameTo(destFile);//返回相对路径return "/upload"+ datepath+model+"/"+filename;}public static void main(String[] args) throws Exception {//文件上传//方案一:(复制,粘贴)//源文件File srcFile = new File("F:\\dir\\a.txt");//目标文件File destFile = new File("F:\\dir\\dir2xxxxxxxxxxx\\a.txt");//FileUtils.copyFile(srcFile, destFile);//方案二:(剪切)boolean flag = srcFile.renameTo(destFile);System.out.println(flag);}

 

第二步:jsp页面的表单要求:

并且表单提交:

<form name="Form1"action="${pageContext.request.contextPath }/xxx/xxx.do" method="post" enctype="multipart/form-data"><s:file name="upload" id="upload" cssStyle="width:450px;"></s:file> *</form>

第三步:文件上传的要求:

在action中定义 或者 在模型驱动(javaBean)定义下面的属性

//获取文件类型的uploadprivate File [] upload;//文件类型private String [] uploadContentType;//文件名private String [] uploadFileName;

其中upload表示页面提交的文件:

uploadContentType表示获取上传文件的类型

uploadFileName表示获取上传文件的名称

注意:如果是单文件上传,就是File类型的对象

           如果是多文件上传,就是File类型的数组对象


public void saveFileUpload(ElecFileUpload elecFileUpload) {//获取当前时间,转换成String类型String progressTime = DateUtils.dateToString(new Date());// 1:文件上传//获取上传文件的数组File [] uploads = elecFileUpload.getUploads();//获取上传文件的文件名String [] uploadsFileNames = elecFileUpload.getUploadsFileName();//获取上传文件的描述String [] comments = elecFileUpload.getComments();//遍历循环组织PO对象,完成保存if(uploads!=null && uploads.length>0){for(int i=0;i<uploads.length;i++){//组织PO对象ElecFileUpload fileUpload = new ElecFileUpload();fileUpload.setProgressTime(progressTime);//当前时间fileUpload.setFileName(uploadsFileNames[i]);//上传的文件名//文件上传的同时,返回路径pathString fileUrl = FileUtils.fileUploadReturnPath(uploads[i], uploadsFileNames[i], "资料图纸管理");fileUpload.setFileUrl(fileUrl);//上传的路径fileUpload.setComment(comments[i]);//上传文件的描述//执行保存elecFileUploadDao.save(fileUpload);}}}


文件下载

(1)不使用struts2提供的文件下载

public String download() throws Exception{//1:获取用户附件ID,查询用户附件对象,获取路径pathString id = elecUser.getFileID();ElecUserFile elecUserFile = elecUserService.findElecUserFileByID(id);//路径pathString path = elecUserFile.getFileURL();//下载时,使用的文件名String name = elecUserFile.getFileName();//处理中文问题,或者使用:name = URLEncoder.encode(name, "UTF-8");name = new String(name.getBytes("gbk"),"iso-8859-1");//2:使用response对象设置文件下载的信息(头部信息,文件类型…)response.setHeader("Content-disposition", "attachment;filename="+name+"");response.setBufferSize(1024);//3:使用InputStream输入流读到path路径下对应文件,将InputStream的输入流写到输出流(response对象中获取)中InputStream in = new FileInputStream(new File(ServletActionContext.getServletContext().getRealPath("")+path));OutputStream out = response.getOutputStream();for(int b=-1;(b=in.read())!=-1;){out.write(b);}out.close();in.close();return null;}

(2)使用struts2提供的文件下载

第一步:配置struts.xml
<result name="download" type="stream"><!-- <param name="contentType">image/jpeg</param> -->    <param name="inputName">inputStream</param>    <param name="contentDisposition">attachment;filename="${#request.filename}"</param>    <param name="bufferSize">1024</param></result>

第二步:在模型驱动的对象中,添加InputStream类型的属性,或者在action中添加属性InputStream  用来存放文件的输入流

其中属性名称要与struts.xml中定义的inputName的值一致。

//文件下载的流的属性private InputStream inputStream;public InputStream getInputStream() {return inputStream;}public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}

第三步:将查询的文件输入流放置到模型驱动定义的inputStream属性中,用来输出文件。

第四步:Action类中代码:

public String download(){try {//获取文件IDString fileID = elecUser.getFileID();//1:使用文件ID,查询用户文件表,获取到路径pathElecUserFile elecUserFile = elecUserService.findUserFileByID(fileID);//路径pathString path = ServletActionContext.getServletContext().getRealPath("")+elecUserFile.getFileURL();//文件名称String filename = elecUserFile.getFileName();//可以出现中文filename = new String(filename.getBytes("gbk"),"iso8859-1");request.setAttribute("filename", filename);//2:使用路径path,查找到对应的文件,转化成InputStreamInputStream in = new FileInputStream(new File(path));//与栈顶的InputStream关联elecUser.setInputStream(in);} catch (Exception e) {e.printStackTrace();}return "download";}





                                                                                                                                                                                                                                                                                           
0 0