当前位置:网络安全 > 【JavaWeb】文件上传与下载

【JavaWeb】文件上传与下载

  • 发布:2023-09-29 06:17

javaWeb】文件上传下载

  • 前言
  • 1。文件上传和下载概述
    • 1。什么是文件上传和下载
    • 2。文件上传下载实现原理
  • 2。文件上传
    • 1。创建Web项目并导入包
    • 2。创建文件上传页面
    • 3。创建Servlet
    • 4。查看运行结果
  • 3。文件下载
    • 1。创建文件下载页面
    • 2。创建Servlet
    • 3。在项目release目录下,创建一个download文件夹,放置jpg文件
    • 4。查看运行结果
  • 后记

前言

本文介绍JavaWeb基础文件上传下载相关知识~,Java全栈学习路线可以参考:【Java全栈学习路线】最全面的Java学习路线及知识列表、Java自学方向指南,包含最全的Java全栈学习技术列表~

1。文件上传和下载概述

1。什么是文件上传和下载

  • 所谓文件上传下载就是将本地文件上传到服务器以及从服务器下载文件到本地的过程。比如现在的网站需要上传头像、上传下载图片或者网盘等,这些都是利用文件上传下载功能来实现的。
  • 文件上传和下载实际上是两步操作。首先是文件上传,即将本地文件上传到服务器,实现多个用户之间的文件共享。第二个是文件下载,即将服务器端文件下载到本地磁盘。

2。文件上传下载实现原理

文件上传下载实现示意图如下:

  • 客户端浏览器通过文件浏览框选择要上传的文件内容(包括文件路径和文件内容)。
  • 客户端浏览器通过点击上传按钮将本地文件上传到服务器。
  • 服务器端通过程序接收本地文件内容,并保存到服务器端磁盘上。

2。文件上传

要实现Web开发的上传功能,通常需要两个步骤:

  • 首先,在网页中添加上传输入项;
  • 第二步,读取Servlet中上传文件的数据,并保存到本地硬盘。

大多数情况下,上传是通过表单、使用标签提交到服务器的。使用标签时需要注意以下两点:

  • (1)必须设置name属性,否则浏览器不会发送上传文件的数据。
  • (2)method属性必须设置为post,ectype属性必须设置为“multipart/form-data”类型。

文件上传注意事项:

  • (1)为了保证服务器安全,上传的文件应放置在外界无法直接访问的目录下,例如WEB-INF目录
  • (2) 为了防止文件被覆盖,上传的文件必须生成唯一的文件名
  • (3) 限制上传文件的最大大小
  • (4) 您可以限制上传文件的类型。接收到上传的文件名时,判断后缀名是否合法

因为直接在Servlet中读取上传的数据并解析对应的文件数据是一件非常麻烦的工作。为了方便对上传数据的处理,Apache组织提供了一个开源组件Commons-FileUpload。该组件可以解析出“multipart/form-data”类型请求的各种表单字段并上传一个或多个文件。它还可以限制上传文件和其他内容的大小。其性能优良,使用极其简单。

文件上传示例如下:

1。创建Web项目并导入包

首先创建一个Web项目,导入开源组件Commons-FileUpload的两个jar包:

  • commons-fileupload-1.3.3.jar
  • commons-io-2.6.jar

2。创建文件上传页面

DOCTYPEhtml>
<html>
<=en>
    <字符集="UTF-8 ">
    <标题>文件上传标题>
>
<身体>
<形式动作="UploadServlet方法=帖子" enctype="多部分/表单数据" >
    <桌子宽度="600"> 
        <tr>
            <td>上传者td>
            <td><输入 类型="文字" 名称="名称"/>td>
        tr>
        <tr>
            <td>上传文件td>
            <td><输入 类型="文件" 名称="我的文件"/>td>
        tr>
        <tr>
            <tdcolspan="2" ><输入 类型= "提交"=" 上传"/>td >
        tr>
    桌子>
形式>
身体>
html>

3。创建Servlet

安装包cn.itcast.文件上传 ;
导入org.apache.commons .文件上传.文件项;
导入org.apache.commons .文件上传.磁盘. DiskFileItemFactory;
导入org.apache.commons .文件上传.servlet. ServletFileUpload;
导入javax.servlet.ServletException ;导入 javax.servlet.注释.WebServlet;
导入javax.servlet.http .HttpServlet;
导入javax.servlet.http .HttpServletRequest;
导入javax.servlet.http .HttpServletResponse;
导入java.io.*;
导入java.util.列表;
导入java.util.UUID ;
/**
 * 由lc于2018年8月24日创建。
 */
@WebServlet(名称 = "UploadServlet", urlPatterns = "/UploadServlet")
公共 UploadSevlet扩展HttpServlet{受保护voiddoPost(HttpServletRequest请求,HttpServlet响应响应) 抛出 ServletException IOException  {
        do获取(请求,响应);
    }
 
    受保护 voiddoGet(HttpServletRequest请求,HttpServlet响应响应) 抛出 ServletException IOException  {
        尝试{
            响应.setContentType("text/html;charset=utf-8"); 
            //1.创建DiskFileItemFactory工厂对象,处理文件上传路径或大小限制
            DiskFileItemFactory工厂=DiskFileItemFactory();
            //设置文件缓存目录,如果该文件夹不存在则创建一个文件 f= 文件( "S:\\临时文件夹");
            如果f存在 ()){
                f.mkdirs();
            }
            工厂.setRepository(f);
            //2。创建并获取ServletFileUpload对象
            ServletFileUpload fileUpload=new ServletFileUpload(工厂);
            //设置字符编码
            文件上传.setHeaderEncoding("utf-8");
            //3。处理上传的文件,首先解析请求,将表单的各个字段封装成FileItem对象
            列表<文件项>文件项=文件上传.parseRequest(请求);
            //获取字符流PrintWriter writer=响应.getWriter ();
            //遍历List集合
            用于 (FileItem fileItem:fileItems ){
                //判断是否为正常场
                if (fileItem.isFormField()){
                    //获取字段名
                    字符串名称=文件项.getFieldName( );
                    if(名称.等于("名称")){
                        //如果字段值不为空
                        if (!fileItem.getString  ().等于( "")){
                            字符串=fileItem.getString(  "utf-8");作者.打印("上传者:"++"
"
); } } } 否则 { //获取上传的文件名 字符串文件名=fileItem.getName(); //处理上传的文件 if(文件名!=null&&文件名!=""){ writer.打印("上传的文件名为:"+文件名+ "
"
); //保持文件名唯一 文件名=UUID.随机UUIDtoString()+"_"+文件名;字符串网络路径="/上传/"; //创建文件路径 字符串文件路径=getServletContext().getRealPath(webpath+文件名); //创建文件对象 文件 文件= 文件() 文件路径); //创建文件夹 文件.getParentFile().mkdirs( ); //创建文件 文件.createNewFile(); //获取上传文件流 InputStream=fileItem.getInputStream( ); //在服务器端使用FileOutputStream打开上传的文件FileOutputStream=FileOutputStream( 文件); //流式复制 字节[]字节= 字节[1024];//每个time 读取一个字节 int长度; //开始读取上传文件的字节,并输出到服务器端的上传文件输出流中 同时 len=在) .
读取字节)>0) 输出.写入(字节,0,len )
;.关闭();.关闭(); 文件项.删除(); writer.打印("文件上传成功!");} } } }捕获 异常 e) { 抛出运行时异常e) )
; } } }

4。查看运行结果

3。文件下载

1。创建文件下载页面

DOCTYPEhtml>
<html>
<=en>
    <字符集="UTF-8 ">
    <标题>文件下载标题>
>
<身体>
<ahref=/下载?文件名=1.jpg>文件下载 a>
身体>html>

2.创建Servlet

安装包cn.itcast.文件上传 ;
导入javax.servlet.ServletException ;
导入 javax.servlet.注释.WebServlet;
导入javax.servlet.http .HttpServlet;
导入javax.servlet.http .HttpServletRequest;
导入javax.servlet.http .HttpServletResponse;
导入java.io.IOException ;
导入java.io.InputStream ;
导入java.io.OutputStream ;
/**
 * 由lc于2018年8月24日创建。
 */@WebServlet(名称="下载Servlet" ,urlPatterns = "/下载")
公共 下载Servlet扩展HttpServlet{
    受保护voiddoPost(HttpServletRequest请求,HttpServlet响应响应) 抛出 ServletException IOException  {
        do获取(请求,响应);
    }
 
    受保护 voiddoGet(HttpServletRequest请求,HttpServlet响应响应) 抛出 ServletException IOException  {
        响应.setContentType("text/html;charset=utf-8"); 
        //获取文件名字符串 文件名 = 请求.getParameter("文件名");
        //文件所在文件夹
        字符串文件夹="/download/";
        //通知浏览器以下载方式打开
        响应.addHeader“内容类型”“应用程序/八位字节流” );
        响应.addHeader“内容处置”“附件;文件名=” +文件名) ; 
        //通过文件输入流读取文件
        InputStream in=getServletContext().getResourceAsStream(文件夹+文件名);
        OutputStream输出=响应.getOutputStream( );
        字节[]字节= 字节[1024];
        int长度=0;同时 len=在) .读取字节 )!=-1){
            输出.写入(字节,0,len );
        }
    }
}

3。在项目发布目录下,创建一个下载文件夹,放置jpg文件

4。查看运行结果

后记

Java全栈学习路线请参考:【Java全栈学习路线】最全的Java学习路线和知识列表,Java自学方向指南,包含最全面的Java全栈-栈学习技术清单~

相关文章