您的位置:首页 > 其它

playframework上传下载

2017-09-27 16:28 246 查看
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
* 该模型用于存储上传文件
* */
@Entity
public 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
* 该模型用于存储上传文件
* */
@Entity
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  play