JdonJive论坛系统完整分析6(转载)

Jive图形处理

  Jive提供了强大的论坛功能,但是有些功能离实际需求还是有一定的距离,例如论坛是用于信息交流讨论的场所。而信息不只是文字,有时还包括图片或一些PDF等类型的文件,那么如何在Jive中实现这样的功能呢?

  6.1 图片上传处理

  在HTML中,使用表单Form主要是用来向服务器提交数据,格式如下:

  <FORM ACTION="URL"

  METHOD="GET|POST"

  ENCTYPE="…" TARGET="...">

  . . .

  </FORM>

  enctype指定了表单提交给服务器时的内容形式(Content-Type),默认值是"application/x-www-form-urlencoded",这时,表单信息一般采用URL编码制。

  但是,当向服务器传送图片或文件这样包含非ASCII字符或二进制数的数据时,根据RFC1867规定,就必须使用“multipart/form-data”内容类型。

  其实无论是默认表单信息,还是图片文件,这些内容都是装载在HTTP协议的正文内容部分,都可以看成HTTP协议携带的对象,只是两种正文内容形式不一样。前者是String字符串类型,而后者则是一个通用的数据对象类型(Object)。在以后章节中将专门讨论HTTP协议装载数据对象的底层细节。

  使用“multipart/form-data”上传文件的格式写法如下:

  <FORM ACTION="URL" METHOD="GET|POST" ENCTYPE=" multipart/form-data ">

  <INPUT TYPE=FILE NAME=file1>

  </FORM>

  文件通过HTTP协议传送到服务器端后,需要在服务器端对该文件进行专门的接受。HttpServletRequest没有提供直接获取文件数据的方法,因此需要开发专门的服务器文件处理组件。

  目前有两种上传文件处理组件:一种是基于完全JSP结构的,使用JSP来处理上传的文件,以SmartUpload(http://www.jspsmart.com)最常用;还有一种是完全的JavaBeans组件:Cos文件上传组件包(http://www.servlets.com/cos/index.html),Cos可以使用在JSP中,也可以使用在Servlet或Servlet Filter中。

  由于在实际应用中,文件上传功能往往和其他正常表单参数一起混合使用,而不是独立使用的。因此,可以设定一个Servlet专门用来处理这类混合表单的请求,在将文件接受处理后,自动导向到处理表单正常参数的JSP/Servlet去处理。

  表单调用示例如下:

  <form action="<%=request.getContextPath()%>/multipartformserv"

  method="post" enctype="multipart/form-data">

  <input type="hidden" name="FORWARDNAME" value="login.jsp" >

  <input type="file" name="file1" >

  <input type="hidden" name="maxwidth" value="120" >

  <input type="hidden" name="maxheight" value="60" >

  <input type="text" name="username" >

  <input type="text" name="password" >

  </form>

  在这个表单中,既有文件提交,也有username这样正常的参数需要提交,提交的Servlet名为multipartformserv。由multipartformserv来处理上传的文件,然后再自动转交到FORWARDNAME的值login.jsp进行username等正常参数的处理。

  在表单中,如果设定maxwidth和maxiheight,那么表示如果上传的图片超过这个尺寸,服务器将缩小图片到这个尺寸。

  编制一个专门用来统一处理Jive系统中所有文件处理的Servlet,这样有利于简化系统。编制MultipartFormServ如下:

  public class MultipartFormServ extends HttpServlet {

  static final private String CONTENT_TYPE = "text/html";

  //文件上传处理

  private static MultipartFormHandle mf = MultipartFormHandle.getInstance();

  //文件上传后存放的临时目录

  private String dirName;

  private ServletContext context;

  public void init() throws ServletException {

  // 从web.xml中读取上传目录参数

  dirName = mf.getUploaddir();

  if (dirName == null) {

  throw new ServletException("Please supply uploadDir parameter");

  }

  }

  //处理带有文件内容的请求

  public void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {

  try {

  mf.init(dirName,request); //调用文件上传处理器处理

  //得到FORWARDNAME参数值

  String forward=mf.getForwardProgram();

  if (forward.equals(""))

  {

  errorMessage("no forward program", response);

  return;

  }

  String param=mf.getForwardProgramParam();

  mf.clear();

  //引导分流到forward参数值进行其他文本参数处理

  getServletConfig().getServletContext().

  getRequestDispatcher("/"+forward+"?"+param).forward(request, response);

  }catch (Exception Ex) {

  throw new ServletException(Ex.getMessage());

  }

  }

  图3-8 上传文件处理框架

}

  MultipartFormHandler主要调用Cos组件处理上传文件,对上传文件图形大小进行处理,然后将图形搬迁到指定的目录;同时也将请求信号中的正常参数提取出来,以作为转发使用。

  这样一个图形或文件上传系统已经形成了一个框架结构,可以重复使用在任何需要图片或文件上传处理的系统中,如图3-8所示。

  图3-8中上传文件处理额Servlet相当于请求信号Request的一个过滤器,既然正常的Request处理机制不能从Request提取携带的文件,那么,使用一个过滤器先将文件提取出来,剩余的再通过正常Request处理机制去处理。

  6.2 服务器端图形处理

  Java最初是以Applet等客户端图形处理为技术起点的,而本节讨论的是如何在Servlet/JSP中实现图形处理。

  在Jive中,图片可以用来显示用户的头像,用户在上传自己头像图片时,该图片的大小可能不一,但是由于版面原因,显示的头像图片又有大小限制,那么就需要在用户上传图片时对图片大小做一个检查。如果超过规定大小,就进行一定的缩放处理。

  缩放处理有两种方式:是在HTML显示时,使用image 语法的width和height来限制大小,但是这样做只是解决了表面问题,无法解决大字节图片传送到客户端带来的性能影响,这个图片因为是用户发言的头像,将会在每个帖子里面显示。如果头像都是巨大图片,对帖子显示速度的影响是很大,因此必须在服务器端进行缩小后,再传送到客户端,这样提高了论坛系统性能。

  服务器端的图形处理需要使用到Java的图形处理技术,而且图形处理是在服务器端的Web容器中进行的。和以往Java在客户端进行图形处理稍微有所不同,相同的是都要使用计算机的底层图形支持资源。

  J2SE 1.4提供新的增强的图形处理功能,JDK1.4中最新的javax.imageio.ImageIO对图片进行读写操作,而使用java.awt.geom.AffineTransform对图片进行尺寸缩放处理。

  import java.io.File;

  import java.awt.image.BufferedImage;

  import java.awt.Image;

  import java.awt.image.AffineTransformOp;

  import javax.imageio.ImageIO;

  import java.awt.geom.AffineTransform;

  public class UploadImg{

  /**

  * 参数设置

  * @param fromdir 图片的原始目录

  * @param todir 处理后的图片存放目录

  * @param imgfile 原始图片

  * @param sysimgfile 处理后的图片文件名前缀

  */

  public void init(String fromdir,String todir,String imgfile,String sysimgfile)

  {

  this.fromdir=fromdir;

  this.todir=todir;

  this.imgfile=imgfile;

  this.sysimgfile=sysimgfile;

  }

  …

  public boolean CreateThumbnail() throws Exception

  {

  //ext是图片的格式 gif、JPG 或png

  String ext=""

  double Ratio=0.0;

  File oldFile = new File(fromdir,imgfile);

  if (!F.isFile()) //检查是否存在此图片文件

  throw new Exception(F+" is not image file error in CreateThumbnail!");

  //首先判断上传的图片是gif还是JPG ImageIO,只能将gif转换为png

  if (isJpg(imgfile)){

  ext="jpg";

  }else{

  ext="png";

  }

  File newFile = new File(todir,sysimgfile+"."+ext);

  BufferedImage Bi = ImageIO.read(oldFile); //读取原始图片

  if ((Bi.getHeight()>120) || (Bi.getWidth()>120)){

  if (Bi.getHeight()>Bi.getWidth())

  Ratio = 120.0/Bi.getHeight();

  else

  Ratio = 120.0/Bi.getWidth();

  }

  //进行图片转换

  AffineTransformOp op =

  new AffineTransformOp(AffineTransform.getScaleInstance(Ratio, Ratio), null);

  Image itemp = op.filter(Bi, null);

  try { //写入转换后的图片

  ImageIO.write((BufferedImage) itemp, ext, newFile);

  }catch (Exception ex) {

  throw new Exception(ex.getMessage());

  }

  return (true);

  }

  }

  该类中由于使用到了Java 的AWT,虽然没有实际显示,但Linux系统下需要X11 Windows的支持(安装Linux时需安装 XFree86,Linux完全安装方式包括安装XFree86)。

  该缩放功能是在图片上传到服务器后再进行的处理,可以对JPG进行缩小放大;对上传是GIF的图片,缩放后变成PN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值