下载:
/*
* 说白了其实导出就是复制粘贴(从存储在云上的文件复制到用户的本地硬盘上):
* 先取得路径,然后根据路径来复制 BufferedInputStream 是为了更高效的复制,read()方法是具体的复制行为
* 把流写出中,write()就是具体的粘贴行为
*/
public class HaHa {
// 下载excel 模板
public Response downLoadExcelModel(HttpServletResponse response,HttpServletRequest request) {
BufferedInputStream bufferedInputStream;
FileInputStream fileInputStream;
OutputStream outputStream;
try {
String modelName = request.getParameter("modelName");
String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\\(").replaceAll("%29", "\\)");// 转义符
String pathName = "excel/" + modelName + ".xlsx";
// path 输出值为:E:\20171128\esim-80002795\esim-service\esim\esim-web\src\main\webapp\excel\险种组合管理表.xlsx 记住,这个方法一般都是在src.main.webapp下面的
String path = request.getSession().getServletContext().getRealPath(pathName);
File file = new File(path);
fileInputStream = new FileInputStream(file);// 如果该路径下面没有该文件,则报 “系统找不到指定路径” 的错误
bufferedInputStream = new BufferedInputStream(fileInputStream);// 记住,BufferedInputStream构造方法的参数一般都是FileInputStream对象
byte[] b = new byte[bufferedInputStream.available()];
bufferedInputStream.read(b);// 以为是excel模板的,文件很小,所以可以一次性读出,如果不是excel模板文件很小,就不能了,因为可能内存溢出
/*
* 利用response得到输出流outputStream
* 再一次性把这输出流写出
*/
response.setContentType("application/vnd.ms-excel");//contentType里面的内容要对应excel格式的啊
response.setHeader("Content-disposition", "attachment;filename=" + modelName1 + ".xlsx");//modelName1一定要是那种编码之后的格式
outputStream = response.getOutputStream();
outputStream.write(b);
} catch (UnsupportedEncodingException e) {
logger.error("下载模版文件名转换异常" + e);
} catch (FileNotFoundException e) {
logger.error("下载模版文件没有找到对应的模版名异常" + e);
} catch (IOException e) {
logger.error("下载模版文件名IO异常" + e);
} finally {
bufferedInputStream.close();
fileInputStream.close();// 我记得这个是不用关的
outputStream.flush();
outputStream.close();
}
}
/* 下载 wmv 或者 MP4 文件
* 因为mp4或者wmv的文件比较大,所以最好不要用availalbe方法啊
*/
public Response downLoadSystemVideo(HttpServletResponse response,HttpServletRequest request,String modelName){
String pathName="video/"+modelName;
String[] split = modelName.split("\\.");//转义符,实际上是对 . 进行 split;因为要下载的文件后缀有wmv 以及 mp4 嘛
String path=request.getSession().getServletContext().getRealPath(pathName);
File file = new File(path);
try(
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);) {
if("wmv".equals(split[split.length - 1])) {
response.setContentType("wmv video/x-ms-wmv");//contentType里面的内容要对应wmv格式的啊
String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\\(").replaceAll("%29", "\\)");
response.setHeader("Content-disposition", "attachment;filename="+modelName1);
}else if("mp4".equals(split[split.length - 1])) {
response.setContentType("mp4 video/mpeg4");//contentType里面的内容要对应mp4格式的啊
String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\\(").replaceAll("%29", "\\)");
response.setHeader("Content-disposition", "attachment;filename="+modelName1);
}
OutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[2000];
int a;
while((a = bufferedInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, a);
}
bufferedInputStream.close();
outputStream.flush();
outputStream.close();
} catch (UnsupportedEncodingException e) {
logger.error("下载视频文件名转换异常"+e);
} catch (FileNotFoundException e) {
logger.error("下载视频文件没有找到对应的视频名异常"+e);
} catch (IOException e) {
logger.error("下载视频文件名IO异常"+e);
}
return null;
}
}
上传:
/***
* http://localhost:8080/testWeb/home.jsp
* @author 80002795
*
*/
@Controller
@RequestMapping("upload")
public class Upload {
/*
* 通过流的方式上传文件
* @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
*/
@RequestMapping("fileUpload")
public void fileUpload(@RequestParam("file01") CommonsMultipartFile commonsMultipartFile) throws IOException {
InputStream is = null;
OutputStream os = null;
System.out.println(commonsMultipartFile.getOriginalFilename());// 员工信息安全手册.pdf
System.out.println(commonsMultipartFile.getFileItem().getName());// C:\Users\Public\Desktop\员工信息安全手册.pdf
System.out.println(commonsMultipartFile.getContentType());// application/pdf
long startTime=System.currentTimeMillis();
try {
is=commonsMultipartFile.getInputStream();//哈哈,通过这个就可以获取输入流了,说白了通过这个方法就是复制了
//得到输出流
//commonsMultipartFile.getOriginalFilename()这个方法是获取导入文件的文件名,说白了下面的代码就是得到文件名,用时间肯定要保持数据的独立性啊
String childFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()) + commonsMultipartFile.getOriginalFilename();
System.out.println(childFileName);
//导入之后,要存进哪里的路径,如果没有这个路径,就创建一个呗
String parentPath = "E:\\upload\\upload22\\upload33";
File filePart = new File(parentPath);
if (!filePart.exists()) {
filePart.mkdirs();
}
File fileAll = new File(filePart,childFileName);//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径
os=new FileOutputStream(fileAll); //获取输出流
// 粘贴输入流到输出流
int temp;
while((temp=is.read()) != -1){ //一个一个字节的读取并写入
os.write(temp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
is.close();
os.flush();
os.close();
}
long endTime=System.currentTimeMillis();
System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");// 得到的时间大概是:14850ms,实在太慢了
}
/*
* 采用file.Transto 来保存上传的文件
*/
@RequestMapping("fileUpload02")
public void fileUpload02(@RequestParam("file02") CommonsMultipartFile commonsMultipartFile, HttpServletRequest request) throws IOException {
long startTime=System.currentTimeMillis();
try {
//除了上传文件,还要得到其它参数啊
String name = request.getParameter("name");
//获得文件名并且得到指定路径
//commonsMultipartFile.getOriginalFilename()这个方法是获取导入文件的文件名,说白了下面的代码就是得到文件名,用时间肯定要保持数据的独立性啊
String childFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()) + commonsMultipartFile.getOriginalFilename();
//导入之后,要存进哪里的路径,如果没有这个路径,就创建一个呗
String parentPath = "E:\\upload\\upload22\\upload33";
File filePart = new File(parentPath);
if (!filePart.exists()) {
filePart.mkdirs();
}
File fileAll = new File(filePart,childFileName);//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径
commonsMultipartFile.transferTo(fileAll);//仔细看与上面的差异,其实,有了这句话,就不用再写获得输入流,创建输出流,写流了,就这么一句话就搞定了。如果再获得输入流的话,就会包io异常:Destination file already exists and could not be deleted
} catch (FileNotFoundException e) {
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("方法二的运行时间:"+String.valueOf(endTime-startTime)+"ms");// 得到的时间大概是:10ms
}
/*
*采用spring提供的上传文件的方法,这种方法又长又丑,都不想看了
*/
@RequestMapping("springUpload")
public void springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
long startTime=System.currentTimeMillis();
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
//检查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request)){
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext()){
//一次遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null){
String path="E:/springUpload"+file.getOriginalFilename();
File file2 = new File(path);
file.transferTo(file2);
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");//输出9ms
}
@RequestMapping("getMultipartFile")
public void getMultipartFile(MultipartFile multipartFile) throws Exception {
long startTime=System.currentTimeMillis();
try {
// String fileName = multipartFile.getName();
String parentPath = "E:\\upload\\upload22\\upload33";
File filePart = new File(parentPath);
if (!filePart.exists()) {
filePart.mkdirs();
}
File fileAll = new File(filePart,"444444");//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径
multipartFile.transferTo(fileAll);
} catch (Exception e) {
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("方法四的运行时间:"+String.valueOf(endTime-startTime)+"ms");
}
}