文件上传

Posted wuxun1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传相关的知识,希望对你有一定的参考价值。

  文件的上传主要有两种协议: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上传文件有两点要注意:一是登录方式有两种,分匿名登录和授权用户名与密码登录;二是应用模式有主动和被动。

以上是关于文件上传的主要内容,如果未能解决你的问题,请参考以下文章

将存储在内存中的文件上传到s3

JS创建文件并上传服务器

ajaxFileUpload上传带参数文件及JS验证文件大小

android的自带的httpClient 怎么上传文件

大文件上传下载实现思路,分片断点续传代码实现,以及webUpload组件

如何通过 HttpWebRequest 上传文件?