zoukankan      html  css  js  c++  java
  • JFinal向客户端渲染图片的方法

    JFinal提供了好几种方便的render但是不知道为啥就是没有提供直接渲染图片的render,如果我们直接在Controller的方法中往输入流中写的话是还是会有默认的render生效的,比如下面这种:

    (示范错误情况,请勿模仿)

    /**
     * 显示图像
     */
    public void showPic(){
    	
    	String filename=getPara("name");
    	if(!securityCheck(filename)){
    		return ;
    	}
    	
    	File imgFile=new File(ConstantRepo.BASE_UPLOAD_FILE_PATH+"/"+filename);
    	try {
    		FileUtils.copyFile(imgFile, getResponse().getOutputStream());
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }

    尽管我们手动的往response的OutputStream中写了东西,但是因为还会有一个默认的render使用当前的方法名作为返回值,这会导致在客户端报404.

    这个时候我们自定义一个Render来专门渲染图片,当我们指定了默认的Render的时候默认的就不再生效,下面是一个可以将图片渲染到输出流的Render,与CaptchaRender类似:

    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.jfinal.render.Render;
    
    /**
     * 
     * 用来向客户端渲染图片
     * 
     * @author CC11001100
     *
     */
    public class ImageRender extends Render {
    	
    	/**要渲染到客户端去的图像文件*/
    	private File imgFile;
    	
    	public ImageRender(File imgFile) {
    		super();
    		this.imgFile = imgFile;
    	}
    
    	public File getImgFile() {
    		return imgFile;
    	}
    
    	public void setImgFile(File imgFile) {
    		this.imgFile = imgFile;
    	}
    
    	/**
    	 * 将特定的图片写回到客户端
    	 */
    	public void render() {
    		response.setContentType("image/jpeg");
    		try {
    			FileUtils.copyFile(imgFile, response.getOutputStream());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    }

    需要注意上面使用了Apache commons-io,引入maven依赖:

    <!-- common-io依赖 -->
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.4</version>
    </dependency>

    将要渲染的图片文件传进去,同时指定要使用的渲染器即可:

    /**
     * 显示图像
     */
    public void showPic(){
    	
    	String filename=getPara("name");
    	if(!securityCheck(filename)){
    		return ;
    	}
    	
    	File imgFile=new File(ConstantRepo.BASE_UPLOAD_FILE_PATH+"/"+filename);
    	render(new ImageRender(imgFile));
    }

    比如用来显示用户头像:

    <img src="<c:url value="/file/showPic?name=${user.avatar}"/>" class="user-avatar"/>

    效果如下:

    image

    .

  • 相关阅读:
    自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
    答网友强护灰飞烟灭关于接口的问题
    浅谈C++的this指针
    padding与margin的区别(网上转的)
    啦啦啦 刚注册的,先水一篇~
    直接把页面的table导出到excel表中
    从FTP下载文件带进度条
    C# 从FTP上下载指定文件到本机
    “无法在证书存储区中找到清单签名证书”错误的解决方法
    网页设置不可复制
  • 原文地址:https://www.cnblogs.com/cc11001100/p/6864751.html
Copyright © 2011-2022 走看看