多文件上传的要求


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)定义下面的属性

//获取文件类型的upload
private 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]);//上传的文件名
//文件上传的同时,返回路径path
String 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,查询用户附件对象,获取路径path
String id = elecUser.getFileID();
ElecUserFile elecUserFile = elecUserService.findElecUserFileByID(id);
//路径path
String 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 {
//获取文件ID
String fileID = elecUser.getFileID();
//1:使用文件ID,查询用户文件表,获取到路径path
ElecUserFile elecUserFile = elecUserService.findUserFileByID(fileID);
//路径path
String path = ServletActionContext.getServletContext().getRealPath("")+elecUserFile.getFileURL();
//文件名称
String filename = elecUserFile.getFileName();
//可以出现中文
filename = new String(filename.getBytes("gbk"),"iso8859-1");
request.setAttribute("filename", filename);

//2:使用路径path,查找到对应的文件,转化成InputStream
InputStream in = new FileInputStream(new File(path));
//与栈顶的InputStream关联
elecUser.setInputStream(in);
} catch (Exception e) {
e.printStackTrace();
}
return "download";
}