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