playframework上传下载

来源:互联网 发布:日理万机的网络意思 编辑:程序博客网 时间:2024/06/10 05:38

web项目中经常要用到上传和下载文件,最常见的就是用户上传头像更改头像。也有时会上传一些资料供用户下载!


Play默认将上传的文件存储到应用的data/attachments/目录下

如果需要将文件保存到其他目录,可以在conf/application.conf文件中指定路径,可以是绝对路径,也可以是Play应用目录的相对路径:

attachments.path=photos

一、不获取文件名称的上传:

1、首先,在应用中定义UserPhoto模型,该模型用于存储上传文件:UserPhoto.java

package models;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Table;import play.db.jpa.Blob;import play.db.jpa.Model;/** * 2017年9月26日20:07:35 * 该模型用于存储上传文件 * */@Entitypublic class UserPhoto extends Model {@Column(name="photo")public Blob photo;@Column(name="photoName")public String photoName;public UserPhoto() {super();}public UserPhoto(Blob photo, String photoName) {super();this.photo = photo;this.photoName = photoName;}public Blob getPhoto() {return photo;}public void setPhoto(Blob photo) {this.photo = photo;}public String getPhotoName() {return photoName;}public void setPhotoName(String photoName) {this.photoName = photoName;}}

2、在视图文件中添加上传文件的表单:index.html:

#{extends 'main.html' /}#{set title:'Home' /}<h1>上传图片</h1>#{form @uploadPhoto(), enctype:'multipart/form-data'}   <input type="file" name="userphoto.photo">   <input type="submit" name="submit" value="上传">#{/form}

3、控制器中添加相应的Action方法:Application.java:

//上传图片或修改图片public static void uploadPhoto(UserPhoto userphoto) {userphoto.save();seeAllPhoto();}

到此上传文件就已经完成了!

下面看整体代码:

UserPhoto模型同上面的UserPhoto.java一样

上传文件的界面index.html同上面的index.html一样

控制器Application.java:

package controllers;import play.*;import play.mvc.*;import java.util.*;import org.h2.engine.User;import models.*;/** * 2017年9月26日20:15:35 * 用于对图片增删改查的控制器 * */public class Application extends Controller {public static void index() {render();}//上传图片或修改图片public static void uploadPhoto(UserPhoto userphoto) {userphoto.save();seeAllPhoto();}//查看所有图片public static void seeAllPhoto(){render();}//加载模型并返回上传的图片public static void userPhoto(long id) {   final UserPhoto user = UserPhoto.findById(id);   notFoundIfNull(user);   response.setContentTypeIfNotSet(user.photo.type());   renderBinary(user.photo.get());}//删除图片public static void deletePhoto(long delid) {//删除上传到服务器的文件final UserPhoto user = UserPhoto.findById(delid);user.photo.getFile().delete();//删除数据库里面的记录,这条语句并不能删除已经上传到服务器上面的文件UserPhoto.delete("delete from UserPhoto where id=?", delid);seeAllPhoto();}//跳往修改图片的界面public static void updatePhotoPage(long updateid){renderArgs.put("updateid", updateid);render();}}

修改图片界面 updatePhotoPage.java:

#{extends 'main.html' /}#{set title:'Home' /}<h1>更新图片</h1>#{form @uploadPhoto(), enctype:'multipart/form-data'}   <input type="file" name="userphoto.photo">   <input type="hidden" name="userphoto.id" value="${updateid}">   <input type="submit" name="submit" value="上传">#{/form}

查看所有图片的界面 seeAllPhoto.java:

#{extends 'main.html' /}#{set title:'Home' /}<table border="1" style="width: 50%">  <tr>    <th>ID</th>    <th>照片</th>    <th>照片</th>  </tr>    #{list items:models.UserPhoto.findAll(), as:'user'}  <tr>    <td>${user.id}</td>    <td><img src="@{userPhoto(user.id)}" style="width: 100px;height: 80px"></td>  <td><a href="/Application/updatePhotoPage?updateid=${user.id}">更新</a>|<a href="/Application/deletePhoto?delid=${user.id}">删除</a></td>  </tr>  #{/list}</table>

显示效果:


二、获取文件名称的上传:

根据一中的代码:

只需要修改Application.java里面的uploadPhoto方法:

//上传图片或修改图片public static void uploadPhoto(File photo,UserPhoto userphoto) throws FileNotFoundException {userphoto.photoFileName = photo.getName();userphoto.photo = new Blob();userphoto.photo.set(new FileInputStream(photo), MimeTypes.getContentType(photo.getName()));userphoto.save();seeAllPhoto();}

修改上传界面index.html:

#{extends 'main.html' /}#{set title:'Home' /}<h1>上传图片</h1>#{form @uploadPhoto(), enctype:'multipart/form-data'}   <input type="file" name="photo">   <input type="submit" name="submit" value="上传">#{/form}

修改更新界面updatePhotoPage.html:

#{extends 'main.html' /}#{set title:'Home' /}<h1>更新图片</h1>#{form @uploadPhoto(), enctype:'multipart/form-data'}   <input type="file" name="photo">   <input type="hidden" name="userphoto.id" value="${updateid}">   <input type="submit" name="submit" value="上传">#{/form}

修改实体类UserPhoto.java:

/** * 2017年9月26日20:07:35 * 该模型用于存储上传文件 * */@Entitypublic class UserPhoto extends Model {@Column(name="photo")public Blob photo;@Column(name="photoFileName")public String photoFileName;}

显示图片界面:


三、下载文件:

1、在控制器Application.java中添加方法:

//下载文件public static void downloadUserPhoto(long id) {   final UserPhoto user = UserPhoto.findById(id);   notFoundIfNull(user);   response.setContentTypeIfNotSet(user.photo.type());   renderBinary(user.photo.get(), user.photoFileName);}

2、在显示所有文件的界面seeAllPhoto.html中添加一个链接:

#{extends 'main.html' /}#{set title:'Home' /}<table border="1" style="width: 50%">  <tr>    <th>ID</th>    <th>照片</th>    <th>名称</th>    <th>操作<th>  </tr>    #{list items:models.UserPhoto.findAll(), as:'user'}  <tr>    <td>${user.id}</td>    <td>${user.photoFileName}</td>    <td><img title="${user.photoFileName}" src="@{userPhoto(user.id)}" style="width: 100px;height: 80px"></td>  <td>  <a href="/Application/updatePhotoPage?updateid=${user.id}">更新</a>|  <a href="/Application/deletePhoto?delid=${user.id}">删除</a>|  <a href="@{downloadUserPhoto(user.id)}">下载</a>  </td>  </tr>  #{/list}</table>

效果图:


可以在conf/application.conf配置文件中添加自定义类型。比如,增加以xcf为扩展名的GIMP图片的MIME类型:

mimetype.xcf=application/x-gimp-image

参考:http://www.playframework.cn/wiki/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0


原创粉丝点击