zoukankan      html  css  js  c++  java
  • 文件的上传和下载

    文件上传

      1、要有一个 form 标签,method=post 请求
      2、form 标签的 encType 属性值必须为 multipart/form-data 值
      3、在 form 标签中使用 input type=file 添加上传的文件
      4、编写服务器代码(Servlet 程序)接收,处理上传的数据。
        encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼
        接,然后以二进制流的形式发送给服务器

      

    我们可以用流的方式,自己读取文件流。也可以用第三方的jar包解析文件(比较方便)

    用到 commons-fileupload.jar 和 commons-io.jar 这两个包。

    ServletFileUpload 类,用于解析上传的数据。
    FileItem 类,表示每一个表单项。
    boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
    判断当前上传的数据格式是否是多段的格式。
    public List<FileItem> parseRequest(HttpServletRequest request)
    解析上传的数据
    boolean FileItem.isFormField()
    判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
    true 表示普通类型的表单项
    false 表示上传的文件类型
    String FileItem.getFieldName()
    获取表单项的 name 属性值String FileItem.getString()
    获取当前表单项的值。
    String FileItem.getName();
    获取上传的文件名
    void FileItem.write( file );
    将上传的文件写到 参数 file 所指向抽硬盘位置 。
    ServletFileUpload 常用方法

    我们可以这样上传一个文件:

    <form action="http://192.168.31.74:8080/09_EL_JSTL/uploadServlet" method="post"
    enctype="multipart/form-data">
    用户名:<input type="text" name="username" /> <br>
    头像:<input type="file" name="photo" > <br>
    <input type="submit" value="上传">
    </form>
    表单
        /**
        * 用来处理上传的数据
        * @param req
        * @param resp
        * @throws ServletException
        * @throws IOException
        */
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
            //1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
            if (ServletFileUpload.isMultipartContent(req)) {
                //创建 FileItemFactory 工厂实现类
                FileItemFactory fileItemFactory = new DiskFileItemFactory();
                // 创建用于解析上传数据的工具类 ServletFileUpload 类
                ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
                try {
                        // 解析上传的数据,得到每一个表单项 FileItem
                        List<FileItem> list = servletFileUpload.parseRequest(req);
                        // 循环判断,每一个表单项,是普通类型,还是上传的文件for (FileItem fileItem : list) {
                        if (fileItem.isFormField()) {
                            // 普通表单项
                            System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
                            // 参数 UTF-8. 解决乱码问题
                            System.out.println("表单项的 value 属性值:" + fileItem.getString("UTF-8"));
                        } else {
                            // 上传的文件
                            System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
                            System.out.println("上传的文件名:" + fileItem.getName());
                            fileItem.write(new File("e:\" + fileItem.getName()));
                        }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    接收表单的servlet

    文件下载

       文件下载相对比较简单

        1 获取响应的输出流

        2 将服务器中的文件流,拷贝到响应的输出流

        3 设置响应头

      我推测应该也有jar包可以操作,也可以自己封装方法。这里给出原生的方法

      

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //获得请求文件名
        String filename = request.getParameter("filename");
        System.out.println(filename);
        
        //设置文件MIME类型
        response.setContentType(getServletContext().getMimeType(filename));
        //设置Content-Disposition
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        //读取目标文件,通过response将目标文件写到客户端
        //获取目标文件的绝对路径
        String fullFileName = getServletContext().getRealPath("/download/" + filename);
        //System.out.println(fullFileName);
        //读取文件
        InputStream in = new FileInputStream(fullFileName);
        OutputStream out = response.getOutputStream();
        
        //写文件
        int b;
        while((b=in.read())!= -1)
        {
            out.write(b);
        }
        
        in.close();
        out.close();
    }
    文件下载
  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12689356.html
Copyright © 2011-2022 走看看