Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片
文件上传的工具类:
每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多。
先创建一个类存储上传文件的信息:
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=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
{@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:文件上传工具类的实现和服务器给客户端发送图片相关推荐
- Java 使用 commons-fileupload 实现文件上传工具类
依赖包 文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io commons-io.jar: https://repo1.maven. ...
- FTP文件上传工具类
import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.a ...
- spring boot 文件上传工具类(bug 已修改)
以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...
- 分享一个文件上传工具类
文件上传状态枚举类: View Code 1 package com.hoo.enums; 2 3 4 5 /** 6 7 * <b>function:</b> 文件上传状态 ...
- 阿里云oss文件上传工具类
阿里云oss文件上传工具类 阿里云oss 阿里云oss 导入文件阿里云oss的maven依赖 <!-- 阿里云oss依赖 --><dependency><groupId& ...
- FastDFS 文件上传工具类
FastDFS文件上传工具类 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;impor ...
- 文件上传工具类FileUploadUtils
文件上传工具类FileUploadUtils StringUtil MimeTypeUtils FileUploadUtils 异常类 FileNameLengthLimitExceededExcep ...
- wmm的学习日记(文件上传漏洞)
这个星期正式学习了一下文件上传漏洞,虽然之前也有接触过这样的题目,但还是云里雾里的感觉.现在应该可以不靠题解完完全全靠自己的脑子做一些简单的题目啦.接下来就让我浅浅总结一下吧. 目录 文件上传漏洞简介 ...
- 阿里云文件上传工具类
文件实体类 @Data public class UploadFile {private String fileName;private String fileType;private long fi ...
最新文章
- 用css如何写正方体,css正方体实现--(transform练习)
- java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher
- 精解C++的switch语句
- java产生的数字发送到页面_JAVA中数字证书的维护及生成方法
- Mac-安装Homebrew报错error: could not lock config file .git/config:
- VMware10上新建虚拟机步骤图解
- 试卷8449c 语言,二级C语言上机题库参考答案
- java开发项目实例_学java开发,项目经验最重要
- 永中Office—给公文设置密码
- java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕
- 新商业模式 私下销售 Private Sales Gilt Groupe年营收1.5亿
- Html 垂直滚动条 定位到 指定位置
- win10 字体 变得模糊 有锯齿
- 3脚送话器内部电路图_电话机维修送话电路故障
- 最短路径(dijistra和floyd算法)
- 基于linux的mplay的mp3程序,基于Linux下的开源wavplay播放器
- 火狐浏览器打不开html,火狐浏览器打不开网页的原因及解决办法
- 【Excel2019(十二):Match与Index函数】【函数语法+与VLOOKUP比较+单元格引用原理+认识COLUMN函数+使用Match与VLOOKUP函数嵌套返回多列结果】
- 在三层交换机上配置Trunk并指定接口封装为802.1q
- 打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nuxt.js