Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片
2017-03-15 22:45
996 查看
文件上传的工具类:
每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多。先创建一个类存储上传文件的信息:
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& db0a lt;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中有一些关于图形界面的语句,在下一篇图形验证码的学习日记中会有详细的解释。
相关文章推荐
- 【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输
- Java实现上传文件图片到指定服务器目录
- java实现客户端向服务器发送文件
- Java客户端通过Http发送POST请求上传文件到web服务器
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- Java实现文件上传服务器和客户端
- 用Java实现简单的文件上传服务器和客户端
- Java客户端上传图片(文件)到c++服务器
- Java实现文件上传服务器和客户端
- Java客户端通过Http发送POST请求上传文件到web服务器
- java实现客户端向服务器发送文件的操作
- java实现上传文件到服务器和客户端
- 黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器
- Java Springboot结合FastDFS实现文件上传以及根据图片url将图片上传至图片服务器
- 服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)
- 多线程实现文件(图片)从客户端并行上传到服务器端--多客户端实现文件上传到服务器
- Java FTP 实现跨服务器文件上传下载
- express(jade或ejs)如何实现上传图片到服务器并在客户端展示(在客户端可以删除)
- java struts2入门学习实例--使用struts2快速实现多个文件上传
- Java实现FTP服务器的上传、下载、删除、查看文件列表