文件的上传主要有两种协议: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 对象属性方法:\n> Name: %s\n> Size: %d\n> ContentType: %s\n> getSubmittedFileName: %s\n> HeaderNames: %s\n> disposition: %s\n",
part.getName(),
part.getSize(),
part.getContentType(),
part.getSubmittedFileName(),
part.getHeaderNames(),
part.getHeader("content-disposition"));
// 得到文件名
String fileName = part.getSubmittedFileName();
}
}
2、ftp上传文件
服务主要是为了在两台计算机之间实现文件的上传与下载,一台计算机作为ftp客户端,另一台计算机作ftp服务端。ftp上传文件有两点要注意:一是登录方式有两种,分匿名登录和授权用户名与密码登录;二是应用模式有主动和被动。