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"/>
效果如下:
.