文件上传的工具类:
每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多。
先创建一个类存储上传文件的信息:
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 ifreturn 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=pile("(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 {@Overrideprotected 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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("image/png");//返回类型为pngServletOutputStream 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中有一些关于图形界面的语句,在下一篇图形验证码的学习日记中会有详细的解释。
如果觉得《Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片》对你有帮助,请点赞、收藏,并留下你的观点哦!