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

.

原文地址:https://www.cnblogs.com/cc11001100/p/6864751.html