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