文件上传的工具类:

每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多。

先创建一个类存储上传文件的信息:

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:文件上传工具类的实现和服务器给客户端发送图片相关推荐

  1. Java 使用 commons-fileupload 实现文件上传工具类

    依赖包 文件上传可以使用 Apache 文件上传组件, commons-fileupload, 它依赖于 commons-io commons-io.jar: https://repo1.maven. ...

  2. FTP文件上传工具类

    import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.a ...

  3. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  4. 分享一个文件上传工具类

    文件上传状态枚举类: View Code 1 package com.hoo.enums; 2 3 4 5 /** 6 7 * <b>function:</b> 文件上传状态 ...

  5. 阿里云oss文件上传工具类

    阿里云oss文件上传工具类 阿里云oss 阿里云oss 导入文件阿里云oss的maven依赖 <!-- 阿里云oss依赖 --><dependency><groupId& ...

  6. FastDFS 文件上传工具类

    FastDFS文件上传工具类 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;impor ...

  7. 文件上传工具类FileUploadUtils

    文件上传工具类FileUploadUtils StringUtil MimeTypeUtils FileUploadUtils 异常类 FileNameLengthLimitExceededExcep ...

  8. wmm的学习日记(文件上传漏洞)

    这个星期正式学习了一下文件上传漏洞,虽然之前也有接触过这样的题目,但还是云里雾里的感觉.现在应该可以不靠题解完完全全靠自己的脑子做一些简单的题目啦.接下来就让我浅浅总结一下吧. 目录 文件上传漏洞简介 ...

  9. 阿里云文件上传工具类

    文件实体类 @Data public class UploadFile {private String fileName;private String fileType;private long fi ...

最新文章

  1. 用css如何写正方体,css正方体实现--(transform练习)
  2. java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher
  3. 精解C++的switch语句
  4. java产生的数字发送到页面_JAVA中数字证书的维护及生成方法
  5. Mac-安装Homebrew报错error: could not lock config file .git/config:
  6. VMware10上新建虚拟机步骤图解
  7. 试卷8449c 语言,二级C语言上机题库参考答案
  8. java开发项目实例_学java开发,项目经验最重要
  9. 永中Office—给公文设置密码
  10. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕
  11. 新商业模式 私下销售 Private Sales Gilt Groupe年营收1.5亿
  12. Html 垂直滚动条 定位到 指定位置
  13. win10 字体 变得模糊 有锯齿
  14. 3脚送话器内部电路图_电话机维修送话电路故障
  15. 最短路径(dijistra和floyd算法)
  16. 基于linux的mplay的mp3程序,基于Linux下的开源wavplay播放器
  17. 火狐浏览器打不开html,火狐浏览器打不开网页的原因及解决办法
  18. 【Excel2019(十二):Match与Index函数】【函数语法+与VLOOKUP比较+单元格引用原理+认识COLUMN函数+使用Match与VLOOKUP函数嵌套返回多列结果】
  19. 在三层交换机上配置Trunk并指定接口封装为802.1q
  20. 打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nuxt.js

热门文章

  1. 基于灰度图的滚动轴承故障诊断python
  2. 校园网局域网组网方案剖析
  3. Jmeter最新安装配置
  4. Linux 服务器开发学习路线总结(配图 c/c++ )后台开发、Golang后台开发、后端技术栈
  5. Python 数据分析师必备的入门学习路线和技能
  6. mybatis-pius的使用
  7. LAMP架构介绍MySQL、MariaDB介绍 MySQL安装
  8. 中文输入法怎样使用日语键盘(106/109)?
  9. openlayers6【七】地图控件controls详解
  10. 期货资管分仓跟单系统的开发搭建