• copy(输入流 , 输出流 , 结束是否关闭流) 复制输入流的数据到输出流

/**

  • 上传文件的Servlet

  • @author xray

*/

public class UploadServlet extends HttpServlet{

public static final String UPLOAD_DIR = “/Users/xray/Documents/xray_mac/upload”;

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

MyLogger log = new MyLogger(UploadServlet.class);

log.info(“start upload…”);

//判断请求中是否存在上传内容

if(ServletFileUpload.isMultipartContent(req)){

//创建上传对象

ServletFileUpload upload = new ServletFileUpload();

//设置上传每个文件的最大长度

upload.setFileSizeMax(1024 * 1024);

//设置上传文件的总大小

upload.setSizeMax(1024 * 1024 * 2);

try {

//获得文件项目的迭代器

FileItemIterator iterator = upload.getItemIterator(req);

//对迭代器进行迭代

while(iterator.hasNext()){

//获得每个表单项

FileItemStream item = iterator.next();

//获得表单项的输入流

InputStream is = item.openStream();

//判断该项是普通表单项目还是上传项目

if(item.isFormField()){

//如果是一般项目,读取文字内容

String value = Streams.asString(is,“UTF-8”);

//判断项目的字段名

switch(item.getFieldName()){

case “username”:

log.info(“用户名:”+value);

break;

case “password”:

log.info(“密码:”+value);

break;

}

}else{

//如果是上传项目,就把文件保存到服务器的目录中 C:/xxx/aa/123.jpg

String filename = UPLOAD_DIR + “/” +

System.currentTimeMillis()+"-"+

FilenameUtils.getName(item.getName());

OutputStream out = new FileOutputStream(filename);

Streams.copy(is, out, true);

log.info(filename+“图片保存完毕”);

}

}

} catch (FileUploadException e) {

e.printStackTrace();

}

}

log.info(“end upload…”);

}

}

文件下载

==================================================================

下载Servlet

/**

  • 下载文件的Servlet

  • @author xray

*/

public class DownloadServlet extends HttpServlet{

public static final String DOWNLOAD_DIR = “/Users/xray/Documents/xray_mac/download”;

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

MyLogger log = new MyLogger(DownloadServlet.class);

//获得文件名

String filename = req.getParameter(“filename”);

log.info(“文件名:”+filename);

//处理中文乱码

filename = new String(filename.getBytes(“ISO-8859-1”),“UTF-8”);

//获得服务器上磁盘文件的输入流

InputStream in = new FileInputStream(DOWNLOAD_DIR+"/"+filename);

//获得发送浏览器的输出流

OutputStream out = resp.getOutputStream();

//设置响应头

resp.setHeader(“content-disposition”, “attachment;filename=”+

URLEncoder.encode(filename, “UTF-8”));

//读写文件流

Streams.copy(in, out, true);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

下载页面

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

Oracle超详细教程.pdf

Oracle经典教程.pdf

图片验证码

===================================================================

作用:提高安全性,提升黑客破解难度。

实现思路:

1、在Servlet中创建图片

2、随机生成4个字母或数字

3、随机绘制线条

4、将图片发送给浏览器

需要类:

BufferedImage 带缓冲的图片

Graphics 绘图对象

ImageIO 实现图片的IO流读写

/**

  • 生成验证码的Servlet

*/

@WebServlet("/code.do")

public class ValidateCodeServlet extends HttpServlet{

public static final String CODES = “ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”;

public static final int WIDTH = 80;

public static final int HEIGHT = 35;

public static final int NUMBER = 4;

public static final int FONT_SIZE = 20;

public static final Color[] COLORS = {Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GREEN,Color.LIGHT_GRAY,

Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};

protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException ,java.io.IOException {

doPost(req,resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//创建缓冲图片对象

BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);

//创建绘图对象

Graphics g = image.getGraphics();

//设置字体大小

g.setFont(new Font(“宋体”,Font.PLAIN,FONT_SIZE));

//设置颜色

g.setColor(Color.GRAY);

//填充矩形方块

g.fillRect(0, 0, WIDTH, HEIGHT);

//随机产生几个字母或数字

Random random = new Random();

char[] codes = new char[NUMBER];

for(int i = 0;i < NUMBER;i++){

g.setColor(COLORS[random.nextInt(COLORS.length)]);

//在字符串中随机取一个字符

codes[i] = CODES.charAt(random.nextInt(CODES.length()));

//绘制该字符

g.drawString(codes[i] + “”, i * FONT_SIZE + 5, FONT_SIZE);

//绘制随机的线条

g.setColor(COLORS[random.nextInt(COLORS.

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

length)]);

g.drawLine(random.nextInt(WIDTH), random.nextInt(HEIGHT),random.nextInt(WIDTH), random.nextInt(HEIGHT));

}

//将验证码保存到Session中

req.getSession().setAttribute(“code”, new String(codes));

//取消浏览器对图片的缓存

resp.addHeader(“Cache-Control”, “no-cache”);

更多推荐

JavaWeb 文件上传下载和图片验证码,java必背代码入门