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 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中有一些关于图形界面的语句,在下一篇图形验证码的学习日记中会有详细的解释。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值