Servlet文件上传和下载

本文详细介绍了使用Apache的commons-fileupload和commons-io库实现文件上传和下载的技术细节,包括HTML表单配置、Servlet处理逻辑、文件路径处理及JSON数据交互。

文件上传和下载需要用到Apach的开源jar包commons-fileupload和commons-io两个。本次上传下载以图片为例。其他文件同理。

上传界面

因为是上传文件,所以只能以post方式提交,同时还要在form里添加enctype="multipart/form-data"表示以二进制流上传文件。文件加载界面用到了jquery需要添加jquery-1.8.3.js。返回文件列表json对象用到了阿里巴巴的fastjson,需要导入jar包。jar包下载地址:下载地址

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>文件上传</title>
  </head>
  <body>

<form method="post" action="MyServlet?action=up" enctype="multipart/form-data">
      文件:<input type="file" name="file"/>
      文件:<input type="file" name="file"/>
      文件:<input type="file" name="file"/>
      文件:<input type="file" name="file"/>
            <input type="submit" value="提交" />
            <a href="down.jsp">查看图片</a>
    </form>

  </body>
</html>

 

文件下载界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片下载</title>
    <script type="text/javascript" src="js/jquery-1.8.3.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn").click(function () {
                // 每次点击显示图片移除原有的图片  防止重复出现
                $("img").remove();
                $("br").remove();
                //将div隐藏  用于显示后面的动画
                $("#d1").hide();
                //利用ajax获取servlet返回的文件列表json对象
                $.getJSON("MyServlet?action=showPicture",function(data){
                    //遍历json字符串  data即为返回的json数据
                    $(data).each(function(i){
                        //定义一个节点  设为左浮动  用于一行展示多张图片
                        var node="<img style='float: left; padding: 10px ' src="+data[i]+" alt="+data[i]+" width='300px'/>";
                        //将节点添加到div节点的最后一个节点
                        $("#d1").append(node);
                    });
                    //图片全部加载完  下滑动画展示
                    $("#d1").slideDown(3000);
                    //为图片设置点击事件   点击即可调用servlet下载
                    $("img").click(function () {
                        alert($(this).attr("src"))
                        window.location="MyServlet?action=down&filename="+$(this).attr("src");
                    });
                });
            });
        });
    </script>
</head>
<body>
    <input id="btn" type="button" value="显示图片" />
    <div id="d1" ></div>
</body>
</html>

 

处理文件上传和下载

直接贴源码,详细内容在注释。


import com.alibaba.fastjson.JSON;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * Created by ljb Cotter on 2018/9/7.
 */
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理乱码
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        //获取请求的操作
        String action=request.getParameter("action");
        System.out.println(action);
        if (action.equals("up")){//上传文件
            doUp(request, response);
        }else if (action.equals("showPicture")){//显示所有的图片
            showPicture(request, response);
        }else if (action.equals("down")){//下载图片
            downImg(request, response);
        }
    }

    /**
     * 上传图片
     * @param request
     * @param response
     */
    private void doUp(HttpServletRequest request, HttpServletResponse response) {
        //在web文件夹下面建立了一个file文件夹用来存放上传的文
        //获取文件夹的路径
        String savaPath=request.getServletContext().getRealPath("file/");
        File file=new File(savaPath);
        //如果文件夹不存在就创建一个
        if (!file.exists()&&!file.isDirectory()){
            file.mkdirs();
        }

        //创建文件上传解析工厂
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //创建解析器
        ServletFileUpload upload=new ServletFileUpload(factory);
        //处理文件上传时包含中文名的问题
        upload.setHeaderEncoding("utf-8");
        //判断是否以二进制上传,不是则结束程序
        if (!ServletFileUpload.isMultipartContent(request)){
            return;
        }

        try {
            //获取上传表单元素集合
            List<FileItem> fileItems=upload.parseRequest(request);
            //遍历集合。每个fileItem对应一个表单输入元素
            for (FileItem fileItem : fileItems) {
                //判读是否为普通表单  也就是文本
                if (fileItem.isFormField()){
                    String name=fileItem.getFieldName();
                    String value=fileItem.getString("utf-8");
                    System.out.println(name+"---------"+value);
                }else {//是文件
                    String fileName=fileItem.getName();
                    if (fileName==null||fileName.equals("")){
                        //文件名为空则不上传
                    }else {
                        //防止文件名重复加一个4个长度的十六进制的UUID
                        fileName= UUID.randomUUID()+"__"+fileItem.getName();
                        File newfile=new File(savaPath,fileName);
                        System.out.println(newfile.getAbsolutePath());
                        //用FileItem自带的write方法上传文件
                        fileItem.write(newfile);
                        fileItem.delete();//上传完成删除该项
                        System.out.println(fileName+"上传成功");
                        //提示用
                        response.getWriter().write(fileName+"上传成功<br/>");
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * 返回图片地址的json用来所上传的展示图片
     * @param request
     * @param response
     * @throws IOException
     */
    private void showPicture(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取文件保存的路径
        String savePath=request.getServletContext().getRealPath("file/");
        File files=new File(savePath);
        System.out.println(files.getAbsolutePath());
        //获取所有文件的集合
        File[] fileList=files.listFiles();
        System.out.println(Arrays.toString(fileList));
        //用来存放截取后的文件名
        List list=new ArrayList();
        for (File file : fileList) {
            String path=file.getPath();
            //将文件名进行截取,获取相对路径
            String temp=path.substring(path.indexOf("file"));
            //将文件名的\替换为/否则会出错
            temp=temp.replaceAll("\\\\","/");
            list.add(temp);
        }
        //利用阿里巴巴的fastjson将文件名集合转成json字符串
        String json= JSON.toJSONString(list);
        System.out.println(json);
        //将json对象返回给前端界面 ,用来展示图片
        response.getWriter().write(json);
    }


    /***
     * 下载图片
     * @param request
     * @param response
     * @throws IOException
     */
    private void downImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取要下载的文件路径 此时是相对路径
        String pathName=request.getParameter("filename");
        System.out.println("*****************************"+pathName);
        //截取文件路径,获取该文件的文件名
        String fileName=pathName.substring(pathName.lastIndexOf("/")+1);
        System.out.println("--------------"+fileName);
        //获取要下载的文件的绝对路径
        pathName=request.getServletContext().getRealPath(pathName);
        //解决下载的文件有中文乱码的问题
        fileName=URLEncoder.encode(fileName,"utf-8");
        //设置头信息,Content-Disposition 用来激活浏览器的文件下载对话框,attachment表示是一个附件,filename下载的文件名
        response.setHeader("content-disposition","attachment;filename="+fileName);
        System.out.println("*********"+pathName);
        //利用org.apache.commons.io的IOUtils将文件写出
        IOUtils.copy(new FileReader(pathName),response.getOutputStream());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值