您的位置:首页 > 编程语言 > Java开发

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中有一些关于图形界面的语句,在下一篇图形验证码的学习日记中会有详细的解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: