zoukankan      html  css  js  c++  java
  • 文件上传

      文件的上传主要有两种协议:http、ftp。一般来说,我们使用ftp传输大文件,用http传输小文件。除了大小之分外,http因为自身的无状态请求限制,上传文件请求只能从客户端发起,服务端处理,而ftp是双通道交互的,也就是客户端和服务端都能互相上传。

      1、http上传文件

      http上传文件使用的是post方式,并需要将编码方式 enctype 设置为 multipart/form-data。假如现在有这么一个表单:

    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="text" name="description" placeholder="上传文件" />
      <input type="file" name="uploadFile" />
      <input type="submit" />
    </form>

      点击submit后,客户端将上传文件请求消息通过二进制流传输到服务器。服务器怎么处理呢?如果是Servlet 3.0 以前的版本, 需使用 Apache的ommons FileUpload,有两个jar需要引入:commons-fileupload.jar、commons-io.jar。Apache封装了大部分操作,只需简单调用它的方法即可:

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
            try
            {
                // 1、创建一个DiskFileItemFactory工厂, 用来配置对上传文件的限制
                DiskFileItemFactory factory = new DiskFileItemFactory();
                // 2、创建一个文件上传解析器
                ServletFileUpload uploader = new ServletFileUpload(factory);
                
                // 3、调用 parseRequest 方法, 将 multipart 所有的数据封装到 list 中
                List<FileItem> items = uploader.parseRequest(request);
                
                // 4、循环处理
                for (FileItem item : items)
                {
                    if (item.isFormField())
                    { // 处理普通字段 (input type="text|radio|checkbox|etc", select, 等).
                        String fieldName = item.getFieldName();
                        String fieldValue = item.getString();
                        // ... (其他操作)
                    }
                    else
                    { // 处理文件数据 (input type="file").
                        String fieldName = item.getFieldName();
                        // 如果是上传文件,显示文件名
                        String fileName = FilenameUtils.getName(item.getName());
                    }
                }
            }
            catch (FileUploadException e)
            {
                throw new ServletException("解析文件出错.", e);
            }
            
        }

      如果是Servlet 3.0以上的版本,直接使用内置的MultiPart API即可:

    @WebServlet("/upload")
    @MultipartConfig
    public class UploadServlet extends HttpServlet
    {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
            Part part = request.getPart("uploadFile");
            
            // 常用属性
            System.out.printf(
                "Part 对象属性方法:
    > Name: %s
    > Size: %d
    > ContentType: %s
    > getSubmittedFileName: %s
    > HeaderNames: %s
    > disposition: %s
    ",
                part.getName(),
                part.getSize(),
                part.getContentType(),
                part.getSubmittedFileName(),
                part.getHeaderNames(),
                part.getHeader("content-disposition"));
            
            // 得到文件名
            String fileName = part.getSubmittedFileName();
        }
    }

      2、ftp上传文件

      服务主要是为了在两台计算机之间实现文件的上传与下载,一台计算机作为ftp客户端,另一台计算机作ftp服务端。ftp上传文件有两点要注意:一是登录方式有两种,分匿名登录和授权用户名与密码登录;二是应用模式有主动和被动。

  • 相关阅读:
    Linux下安装Readis
    windows下的Redis安装:
    解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题
    dom4j操作XML
    Ajax优缺点
    来一打前端博客压压惊
    tinypng upload一键压缩上传工具,告别人肉
    手把手教你撸一个简易的 webpack
    前端路由简介以及vue-router实现原理
    JS 数据类型、赋值、深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/9210880.html
Copyright © 2011-2022 走看看