通过servlet的方式输出图片流 (类似验证码的生成)
这个模块挺大,我仅说说用servlet显示图片部分。我先说说用servlet显示图片的一个流程:
1. 设置response的输出类型:
对应的语句--response.setContentType("image/gif;charset=GB2312") ,response
便能输出gif图片,"image/gif;charset=GB2312"便是输出类型,当然你可以输出
"image/jpg;charset=GB2312"类型文件。
2. 得到文件流:
servlet是以流的形式件图片文件从服务器读出,通过response将流发到浏览器的。
3. 得到输出流:
对应的语句--OutputStream output = response.getOutputStream();
当然,处理图片文件需要以二进制形式的流。
4. 文件流的编码(但也不一定必须编码的,如果不是文件流,则必须编码)
所以我给大家一个用编码的代码和不用编码的代码.
顺便说一句,sun公司仅提供了jpg图片文件的编码api。
我想基本流程都讲完了,下面我把代码拿给大家看一下,大家自然一目了然了:
package xjw.personal.servet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.image.codec.jpeg.*;//sun公司仅提供了jpg图片文件的编码api
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ShowPicture extends HttpServlet
{
private static final String GIF="image/gif;charset=GB2312";//设定输出的类型
private static final String JPG="image/jpeg;charset=GB2312";
public void init() throws ServletException
{
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
String spec=request.getParameter("spec");//输出图片的类型的标志
int int_spec=Integer.parseInt(spec);
if(spec==1)
{
String imagePath="/jfgg/b1.jpg";//图片相对web应用的位置
}
else
{
String imagePath="/jfgg/b2.gif";//图片相对web应用的位置
}
OutputStream output = response.getOutputStream();//得到输出流
if(imagePath.toLowerCase().endsWith(".jpg"))//使用编码处理文件流的情况:
{
response.setContentType(JPG);//设定输出的类型
//得到图片的真实路径
imagePath = getServletContext().getRealPath(imagePath);
//得到图片的文件流
InputStream imageIn = new FileInputStream(new File(imagePath));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
}
if(imagePath.toLowerCase().endsWith(".gif"))//不使用编码处理文件流的情况:
{
response.setContentType(GIF);
ServletContext context = getServletContext();//得到背景对象
InputStream imageIn=context.getResourceAsStream(imagePath);//文件流
BufferedInputStream bis=new BufferedInputStream(imageIn);//输入缓冲流
BufferedOutputStream bos=new BufferedOutputStream(output);//输出缓冲流
byte data[]=new byte[4096];//缓冲字节数
int size=0;
size=bis.read(data);
while (size!=-1)
{
bos.write(data,0,size);
size=bis.read(data);
}
bis.close();
bos.flush();//清空输出缓冲流
bos.close();
}
output.close();
}
}
最后是如何调用,你可以简单的映射一下servelt,我就将servet的名映射为
ShowPic, 于是下代码调用
通过JSP文件的方式输出图片流(区分TOMCAT和WEBLOGIC,通验证码类似,可以参看应用服务器和WEB服务器中的说明)
TOMCAT的方式(语法比较随意,可以有多种写法,以下仅列举几种)
<%@page import=" java.io.*"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import=" javax.imageio.*"%>
<%@page import=" com.sun.image.codec.jpeg.*"%>
<%@page import=" com.htsoft.core.util.CreateFile"%>
<%@page pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
//in=new FileInputStream(file);
//BufferedImage image=ImageIO.read(in);//读取图片
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
//
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1,false);
encoder.encode(image, param);//对图片进行输出编码
//encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
out.clear();
out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>
<%@page contentType="image/jpeg" import="java.awt.*,com.htsoft.core.util.CreateFile,com.sun.image.codec.jpeg.*,java.awt.image.*,java.io.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
//
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1,false);
encoder.encode(image, param);//对图片进行输出编码
//encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
out.clear();
out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>
<%@page contentType="image/jpeg" import="java.awt.*,com.htsoft.core.util.CreateFile,com.sun.image.codec.jpeg.*,java.awt.image.*,java.io.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
response.reset();
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
//
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1,false);
encoder.encode(image, param);//对图片进行输出编码
//encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
out.clear();
out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>
WEBLOGIC的方式(也有几种写法,可以参考,都是通过实验验证过的)
<%@page contentType="image/jpeg" import="java.awt.*,com.htsoft.core.util.CreateFile,com.sun.image.codec.jpeg.*,java.awt.image.*,java.io.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
response.reset();
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
//
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1,false);
encoder.encode(image, param);//对图片进行输出编码
//encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
//out.clear();
//out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>
<%@page contentType="image/jpeg" import="java.awt.*,com.htsoft.core.util.CreateFile,com.sun.image.codec.jpeg.*,java.awt.image.*,java.io.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
response.reset();
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
//
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1,false);
encoder.encode(image, param);//对图片进行输出编码
//encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
output.close();
//out.clear();
//out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>
<%@page contentType="image/jpeg" import="java.awt.*,com.htsoft.core.util.CreateFile,com.sun.image.codec.jpeg.*,java.awt.image.*,java.io.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
try{
response.reset();
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
//得到图片的文件流
imageIn = new FileInputStream(new File(file));
//得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
//得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
//得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(image);//对图片进行输出编码
imageIn.close();//关闭文件流
output.close();
//out.clear();
//out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
%>