最近正在使用Play框架搭建项目,做到图片上传部分有一些问题,所以记录一下解决情况
1. Play框架的文件上传简介
Play框架处理了HTTP文件上传,我们只需要调用就好了。上传的图片会首先缓存在tmp目录中,然后会在data/attachments/目录下生成一个图片文件,文件名的形式为一串UUID但是没有后缀名。
2. Models创建
Play框架利用play.db.jpa.Blob类型来存储图片,所以Models中用于图片上传需要有两个成员变量:
1.用于保存文件名的String
2.用于保存图片的Bolb
@Entity(name = "houses")
public class Houses extends Model {
// 主图
public String mainimg;
//主图的Bold
public Blob mainimgblob;
}
3. 图片上传
<!--上传图片-->
<label class="back-upbtn color1">
<i class="bg w-upimg-ico1"></i>本地上传
<input type="file" id="file_upload" name="mainimgFile">
</label>
public static void publish( File mainimgFile) throws FileNotFoundException {
// ************主图文件上传开始****************
// 获取上传文件的名称
houses.mainimg = mainimgFile.getName();
houses.mainimgblob = new Blob();
houses.mainimgblob.set(new FileInputStream(mainimgFile),
MimeTypes.getContentType(mainimgFile.getName()));
// ************主图文件上传结束*************************
index();
}
注意: 页面file的name要和controller的参数一致
4. 图片显示
#{list items:house, as:'house'}
<img title="${house.mainimg}" src="@{housePhoto(house.id)}">
#{/list}
/*
* 跳转到图片上传测试页面
*/
public static void totest() {
Houses house = new Houses();
house.id = (long) 12;//传一个house,house里保存了id,mainimg和mainimgblob
render("newhouse/test.html",house);
}
/*
* 图片显示
*/
public static void housePhoto(long id) {
final Houses house = Houses.findById(id);
notFoundIfNull(house);
response.setContentTypeIfNotSet(house.mainimgblob.type());
renderBinary(house.mainimgblob.get());
}
向页面传递一个house,调用图片显示的方法就能获取house里面的blob,然后就能显示图片了
还可以参考官方示例:
http://www.jianshu.com/writer#/notebooks/8096021/notes/7355251/preview