文件上传的工具类:
每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多。
先创建一个类存储上传文件的信息:
package com.upload;
/**
* 每上传成功一个文件的信息
* @author Administrator
*
*/
public class UpdFile
{
private long size;
private String oldname;
private String newname;
private String mime;
public UpdFile(){}
public UpdFile(long size,String oldname,String newname,String mime)
{
this.size=size;
this.oldname=oldname;
this.newname=newname;
this.mime=mime;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getOldname() {
return oldname;
}
public void setOldname(String oldname) {
this.oldname = oldname;
}
public String getNewname() {
return newname;
}
public void setNewname(String newname) {
this.newname = newname;
}
public String getMime() {
return mime;
}
public void setMime(String mime) {
this.mime = mime;
}
}
文件上传工具类:
package com.upload;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.Part;
/**
* 用于文件上传的工具类
* @author Administrator
*
*/
public class UploadUtils
{
/**
* 上传文件
* @param parts
* @param allowmime 允许的mie ,image/jpeg,image/pjpeg,image/bmp,image/png
* @param allowext 允许的扩展名, jpg,txt,bmp,png,java
* @param maxzie 允许最大文件大小 字节
* @param targetname 新文件名及服务器上的路径
* @return
* @throws UploadException
* @throws IOException
*/
//上传多个文件
public static List<UpdFile> upload(Collection<Part> parts,String allowmime,long maxzie,String targetpath)throws UploadException, IOException
{
List<UpdFile> list=new ArrayList<UpdFile>();
if(null!=parts&&parts.size()>0)
{
Iterator<Part> it=parts.iterator();
while(it.hasNext())
{
Part part=it.next();
//这里的if是用于判断是普通表单域还是文件上传,普通表单域是没有FileName的,如果是普通表单域就跳过这一次循环。
if("".equals(getFileName(part)))
{
continue;
}
String contentType=part.getContentType();//得到上传的文件的mime类型
long size=part.getSize();
if(allowmime(allowmime, contentType)&&size<=maxzie)//判断mime类型和文件大小是否匹配要求
{
//上传
UpdFile up=new UpdFile();//新建一个文件类,用于存储文件的信息。
up.setMime(contentType);
up.setSize(size);
String oldname=getFileName(part);//得到上传上来之前客户端文件的文件名
up.setOldname(oldname);
String extname=getExtName(oldname);//得到文件扩展名
String randname=randFileName();//生成一个随机的文件名。
String newname=randname+extname;//新文件名=随机文件名+文件扩展名。
up.setNewname(newname);
part.write(targetpath+File.separator+newname);//写入服务器
list.add(up);
}else
{
throw new UploadException();
}//end if 这样可以知道这个大括号对应上面的哪一个
}//end while
}//end if
return list;//返回一个list
}
/**
* 判读mime类型是否合法
* @param alltype image/jpeg,image/pjpeg,image/bmp,image/png
* @param mimetype image/mpeg
* @return true合法,
*/
public static boolean allowmime(String alltype,String mimetype)//允许传入的mime类型,返回一个boolean类型的值
{
boolean re=false;
if(null!=alltype&&null!=mimetype&&alltype.indexOf(mimetype)!=-1)//判断是否符合上传的要求
{
re=true;//是的话返回true
}
return re;
}
private static SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddHHmmsssss");//新建一个时间对象
private static Random random=new Random();//随机类
public static String randFileName()//产生一个随机文件名
{
return sf.format(new Date())+"_"+random.nextInt(1000);//返回的随机的文件名是:时间+随机数
}
public static String getExtName(String fname)//得到文件的扩展名
{
String ex="";
int index=fname.lastIndexOf(".");//这里不太懂,应该是返回最后一个点的位置?主要用来判断有没有点。
if(index!=-1)//如果找到的话
{
//substring方法:返回一个新的字符串,它是原字符串的资格子字符串。该子字符串始于指定索引处的字符,一直到此字符串的末尾。
ex=fname.substring(index);//这里应该是返回文件名的点(.)之后的字母(应该是包括点的),作为一个新的字符串。也就是返回文件的扩展名。
}
return ex;
}
public static 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;
}
}
在servlet中调用这个工具类:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.List;
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.UpdFile;
import com.upload.UploadException;
import com.upload.UploadUtils;
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet
{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
Collection<Part> parts=req.getParts();//得到很多parts对象。
ServletContext sc=this.getServletContext();
String path=sc.getRealPath("ups");//得到ups的绝对路径。
List<UpdFile> all=null;
try {
//用自己写的工具类上传。
all=UploadUtils.upload(parts, "image/jpeg,image/pjpeg,image/bmp,image/png", 1024*1024*2, path);
out.print("<h1>上传成功:</h1><ul>");
if(null!=all)
{
for(UpdFile up:all)//迭代出文件信息并且打印出来
{
out.println("<li>"+up.getOldname()+"__"+up.getNewname()+"___"+up.getMime()+"</li>");
}
}
out.println("</ul>");
} catch (UploadException e)
{
out.println("<h1>上传失败</h1>");
e.printStackTrace();
}
out.close();
}
}
这个工具类写好以后可以打包成一个jar包,以后如果其他项目需要的话,可以直接导入jar包,就可以用这个类啦!十分的方便!
服务器给客户端发送图片:
这个图片是服务器绘制的,可以根据用户(客户端)发送的请求回应不同的图片内容,是动态的。相当于用Servlet生成一张图片。
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Servlet画图</h1>
<img src="audjpy"/>
</body>
</html>
ImageServlet:
package com.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/audjpy")
public class ImageServlet extends HttpServlet
{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("image/png");//返回类型为png
ServletOutputStream output=resp.getOutputStream();//构建输出流
BufferedImage img=new BufferedImage(400, 300, BufferedImage.TYPE_INT_BGR);
Graphics g=img.getGraphics();//
g.setColor(new Color(200,200,200));
g.fillRect(0, 0, 400, 300);
g.setFont(new Font("微软雅黑",Font.BOLD,26));
g.setColor(Color.RED);
g.drawString("画字。。。", 100, 80);
ImageIO.write(img, "png", output);
output.flush();
output.close();
}
}
这样就可以服务器给客户端动态的显示图片啦!
- ImageServlet中有一些关于图形界面的语句,在下一篇图形验证码的学习日记中会有详细的解释。