day02

文件上传下载

文件上传下载定义:

上传:浏览器将本地的文件上传到服务器,交给服务器保存

下载:把服务器保存的内容下载到本地

上传

  1. 文件上传必须是post类型的表单提交
  2. 文件上传要设置enctype(application/X-www-from-urlencoded默认,multipart、from-data文件上传用的)
  3. 普通表单上传的数据ey:username=?&password=?     
  4. 文件上传的表单的数据:request.getParameter()不行
分隔符

部件一头信息

空行

部件一的内容

分隔符

部件二头信息

空行

部件二的内容

分隔符...

!服务器在同一个项目里面不允许多个Servlet映射同一个路径

文件上传步骤

  1. 导包(commons-fileupload-1.2.1.jar commons-io-2.0.jar )
  2. 调方法
//判断当前请求是否一个文件上传请求
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>

文件下载

  1. 错误的将文件交给浏览器(直接将流交给浏览器 ,浏览器有默认行为,认识的打开,不认识的下载)
  2. //找到图片的真实路径
    ServlerContext context = getServletContext();
    String realPath = context.getRealPath("文件名");
    //获取要下载的文件的值
    FileInputStream is  = new FileInputStream(realPath);
    //将这个输入流写给浏览器
    ServletOutputStream os = response.getOutputStream()
    //输入刘写给输出流
    IOUtils.copy(is,os);
    os.close;
    is.close;

  3. 正确的交给浏览器(命令浏览器,不要打开,直接下载,在响应头中告诉浏览器)
  4. 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值