今天学的是文件的上传(从客户端传到服务器)
Http文件上传客户端要求(在html中要注意的事情):
1、用表单提交数据
<from></form>
2、请求方法必须为post
<form method="post">
3、以二进制流提交数据给服务器(改变enctype的值)
<form enctype="multipart/form-data" action="UploadFile" method=post >...</form>
//enctype默认值为application/x-www-form-urlencoded,不会提交文件内容,只会提交文件名。enctype值设为multipart/form-data时,才能提交文件内容给服务器。
在服务器端:
Servlet3.0 文件上传支持:
HttpServletRequest
增加了对文件上传的支持。
HttpServletRequest
提供了如下两个方法来处理文件上传。
Part getPart(String name)
:根据名称来获取文件上传域。
Collection<Part> getParts()
:获取所有的文件上传域。
每个Part对象封装一个文件上传域,该对象提供了大量方法来访问上传文件的文件类型、大小、输入流等,并提供了一个write(String file)//这里的file是"(要写的文件所在的绝对路径)+(新文件名)"
方法将上传文件写入服务器磁盘。
- 注意:必须在接受上传Servlet上增加@MultipartConfig配置
这里有一个简单的实现文件上传的Servlet:
index页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<center>
<form action="upload" enctype="multipart/form-data" method="post">
文件:<input type="file" name="pic"/><br/>
描述:<input type="text" name="dis"/><br/>
<input type="submit" value="Upload"/><br/>
</form>
</center>
</body>
</html>
Servlet:
package com.oracle;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import com.upload.UploadUtils;
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet01 extends HttpServlet
{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
ServletContext sc=this.getServletContext();
Part part=req.getPart("pic");//根据表单项的名字得到Part对象
if(null!=part)
{
String contentType=part.getContentType();//得到文件类型
long size=part.getSize();//得到文件大小
Collection<String> allheader= part.getHeaderNames();//得到所有报头名
Iterator<String> it=allheader.iterator();//迭代器
out.println("<h1>contentType:"+contentType+"</h1>");
out.println("<h1>size:"+size+"</h1>");
out.println("<h1>表单项的name:"+part.getName()+"</h1><ul>");
out.println("<h1>文件描述:"+req.getParameter("dis")+"</h1>");
while(it.hasNext())//迭代出所有报头和其所对应的值
{
String header=it.next();
String value=part.getHeader(header);
out.println("<li>"+header+":"+value+"</li>");
}
String newname=sc.getRealPath("ups")+File.separator+randFileName()+this.getExtName(this.getFileName(part));//新的路径+文件名
part.write(newname);//将文件写入服务器
// part.delete();
out.println("</ul>");
out.println("<h1>服务器数据表存:原文件名:"+this.getFileName(part)+" 新文件名:"+newname+" MIME类型:"+part.getContentType()+"</h1>");
}
// out.close();
}
private SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddHHmmsssss");
private Random random=new Random();
public String randFileName()//根据时间写一个文件名,精确到毫秒,再加一个随机数
{
return sf.format(new Date())+"_"+random.nextInt(1000);
}
public String getExtName(String fname)//得到文件的扩展名(不包括原文件名)
{
String ex="";
int index=fname.lastIndexOf(".");
if(index!=-1)
{
ex=fname.substring(index);
}
return ex;
}
public String getFileName(Part part)//得到原文件名
{
String fname="";
String hvalue=part.getHeader("Content-Disposition");
//form-data; name="pic"; filename="hello.txt"
Pattern pattern=Pattern.compile("(form-data; name=\"(.*?)\"; filename=\"(.*?)\")");
Matcher mach=pattern.matcher(hvalue);
if(mach.find())
{
fname=mach.group(3);
}
return fname;
}
}
今天就先到这吧~