文件上传下载
文件上传下载定义:
上传:浏览器将本地的文件上传到服务器,交给服务器保存
下载:把服务器保存的内容下载到本地
上传
- 文件上传必须是post类型的表单提交
- 文件上传要设置enctype(application/X-www-from-urlencoded默认,multipart、from-data文件上传用的)
- 普通表单上传的数据ey:username=?&password=?
- 文件上传的表单的数据:request.getParameter()不行
分隔符
部件一头信息
空行
部件一的内容
分隔符
部件二头信息
空行
部件二的内容
分隔符...
!服务器在同一个项目里面不允许多个Servlet映射同一个路径
文件上传步骤
- 导包(commons-fileupload-1.2.1.jar commons-io-2.0.jar )
- 调方法
//判断当前请求是否一个文件上传请求
boolean b = ServletFileUpload.isMultipartContent(request);
if(b){
//创建一个FileItem工厂
FileItemFactory factory = new DiskFileItemFactory();
//创建一个ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(factory);
//把文件上传请求解析后形成一个表单的详细信息
List<FileItem> list = upload.parseRequest(request);
}
解析每一个表单项内容
for(FileItem fileItem : items){
if(fileItem.isFormFiled()){
sout(表单提交的key+fileItem.getFieldName())
sout(表单提交的value+fileItem.getString())
}
}else{
sout(表单提交的key+fileItem.getFieldName())
sout(上传的文件名+fileItem.getName())
sout(文件信息的大小+fileItem.getSize())
//获取到文件流的并保存到某个地方
InputStream is = fileItem.getInputStream;
OutputStream os = new FileOutputStrean("保存路径"+fileItem.getName)
IOUtils.copy(is,os)
os.close
is.close
}
在jsp页面展示上传的图片
1.导包
2.预解析
3.处理文件上传
for(FileItem.isFromItem){
}else{
//把文件保存在当前项目的文件夹中
InutStream is = fileItem.getInputStream();
//new FileOutputStream(file)
//细节一获取某个文件或者文件夹在服务器中的真实路径
//一个项目对应一个ServletContext
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath("/文件夹名")
//细节二Ie下获取的文件名带路径
/*
String[] split = fileItem.getName().split("\\");(有一个斜杠是转义)(编译报错不能分割\)
fileName = split[split.length-1];
*/
//另一种方法
int lastIndexOf = fileItem.getName().lastIndexOf("\\)
fileName = fileItem.getName.subString(lastIndexOf+1)
//细节三为防止同名文件覆盖加UUID
fileName = UUID.randomUUID().toString().replace("-","")+fileName
//路径加文件名
FileOutputStream os = new FileoutputStream(realPath+"/"+fileName)
IOUtils.copy(is,os)
os.close
is.close
//每上传一次添加一次路径
addImgPath("/文件名(保存的文件夹的名称)/"+fileName)
}
4.展示图片列表
//将上传的文件路径保存在域中获取
可以写一个工具类
保存所有的图片路径
priivate static List<String> paths = new ArrayList<String>();
添加图片路径
pubic static void addImgPath(String path){
paths.add(path);
}
获取所有图片路径
pubic static List<String> getAllpath(){
return paths;
}
jsp页面
<c:forEach items = "<%=类名.getAllpath()%>" var="path">
<div class="imgs"><img src = "/项目名/${path}"/}></div>
</c:forEach>
文件下载
- 错误的将文件交给浏览器(直接将流交给浏览器 ,浏览器有默认行为,认识的打开,不认识的下载)
-
//找到图片的真实路径 ServlerContext context = getServletContext(); String realPath = context.getRealPath("文件名"); //获取要下载的文件的值 FileInputStream is = new FileInputStream(realPath); //将这个输入流写给浏览器 ServletOutputStream os = response.getOutputStream() //输入刘写给输出流 IOUtils.copy(is,os); os.close; is.close;
- 正确的交给浏览器(命令浏览器,不要打开,直接下载,在响应头中告诉浏览器)
-
String file = request.getParameter("file") //找到图片的真实路径 ServlerContext context = getServletContext(); String realPath = context.getRealPath(file); //获取要下载的文件的值 FileInputStream is = new FileInputStream(realPath); //获取文件名 int length = UUID.randomUUID().toString().replace("-",""); int lastIndexOf = file.lastIndexOf("/"); String fileName = filesubString(lastIndexOf+1) filename = filename.substring(length) //解决中文乱码 String string = new String(filename.get("GBK"),"ISO-8859-1"); //设置响应头(设置附件,浏览器会下载) response.setHeader("Content-Disposition","attachment;filename=filename"); //将这个输入流写给浏览器 ServletOutputStream os = response.getOutputStream() //输入刘写给输出流 IOUtils.copy(is,os); os.close; is.close;
jsp页面
<c:forEach items = "<%=类名.getAllpath()%>" var="path">
<div class="imgs"><img src = "/项目名/${path}"/}></div>
<a href = "download?file=${path}">下载此图片</a>
</c:forEach>