您的位置:首页 > 产品设计 > UI/UE

RESTEasy实现上传下载文件

2013-12-19 23:14 417 查看
    近期,使用RESTEasy实现了上传下载文件。这次我是使用guice来注册服务,要想使用guice来注册服务,需要修改web.xml:

将:

<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<!-- 不加监听器就会造成Tomcat无法解析html -->
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
修改成:
<context-param>
<param-name>resteasy.guice.modules</param-name>
<param-value>org.oliver.module.FileModule</param-value>
</context-param>

<listener>
<listener-class>
org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
</listener-class>
</listener>


配置resteasy.guice.modules来指明注册服务类FileModule。FileModule实现了com.google.inject.Module接口,并实现了它的configure(Binderbinder)方法,如下:
import org.oliver.resource.DownloadFileResource;
import org.oliver.resource.FilePath;
import org.oliver.resource.UploadFileResource;

import com.google.inject.Binder;
import com.google.inject.Module;

/**
* 注册服务
*
* @author Oliver
*
*/
public class FileModule implements Module {

public void configure(final Binder binder) {
binder.bind(UploadFileResource.class);
binder.bind(DownloadFileResource.class);
binder.bind(FilePath.class);
}
}

这样三个服务类注册完成。现在就开始编写上传下载文件。

上传文件

1、上传文件页面设计如下:

<form action="./serivce/upload/file" method="post" enctype="multipart/form-data">
文件名:<input type="text"  name="fileName" id="fileName" readonly="true" value=""/><br/>
文件:<input type="file" name="file" id="file" value=""/><br/>
<input type="submit" value="提交" />
</form>


2、文件类定义如下:

import javax.ws.rs.FormParam;
import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.annotations.providers.multipart.PartType;

public class DisKFile {

private String fileName;
private byte[] fileDate;

public DisKFile() {
}

public String getFileName() {
return fileName;
}

@FormParam("fileName")
public void setFileName(String fileName) {
this.fileName = fileName;
}

public byte[] getFileDate() {
return fileDate;
}

@FormParam("file")
@PartType(MediaType.APPLICATION_OCTET_STREAM)
public void setFileDate(byte[] fileDate) {
this.fileDate = fileDate;
}
}

3、服务实现如下:

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.io.FileUtils;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.oliver.model.DisKFile;
import org.oliver.model.Message;

@Path("/upload")
public class UploadFileResource {

public static final String DIRCTORY = "E:/temp";

// @PUT
@POST
@Path("/file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json;charset=UTF-8")
public Response upload(@MultipartForm DisKFile diskFile,
@Context HttpServletRequest request) {
try {
initDirectory(DIRCTORY);
String newName = getNewName(diskFile.getFileName());
File file = new File(DIRCTORY + "/" + newName);
FileUtils.writeByteArrayToFile(file, diskFile.getFileDate());
} catch (IOException e) {
e.printStackTrace();
}
Message message = new Message(true, "文件上传成功!");
return Response.ok(message).build();
}

/**
* 初始化目录
*
* @param path
* @throws IOException
*/
private void initDirectory(String path) throws IOException {
File dir = new File(path);
if (!dir.exists()) {
FileUtils.forceMkdir(dir);
}
}

private String getNewName(String fileName) {
String newFileName = "Unkonwn";
if (fileName != null) {
int index = fileName.lastIndexOf(".");
if (index != -1)
newFileName = UUID.randomUUID().toString()+fileName.substring(index);
}

return newFileName;
}

}


4、运行效果

    在浏览器中输入http://localhost:8080/UploadAndDownLoadFile/,进入如下页面:



    点击“提交”,返回json:
{"status":true,"infor":"文件上传成功!"}

下载文件

    下载文件就相对简单,只用后端将文件流写入javax.ws.rs.core.Response中即可,浏览器会自动解析。

1、服务实现如下:

import java.io.File;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;

@Path("/download")
public class DownloadFileResource {

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response download(@QueryParam(value = "fileName") String fileName,
@Context HttpServletRequest request) {
if(fileName == null||fileName.isEmpty()){
ResponseBuilder response = Response.status(Status.NOT_FOUND);
return response.build();
}
String filePath = this.getClass().getClassLoader().getResource("/").getPath().replace("/WEB-INF/classes/", "");
File file = new File(filePath+"/file/"+fileName);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\""+fileName+"\"");//"attachment; filename=\"fileName.txt\""
return response.build();
}

}

2、运行效果

    在浏览器下输入:http://localhost:8080/UploadAndDownLoadFile/serivce/download?fileName=fileName.pdf,就能成功下载图片



附录

    下载文件放在WebContent/file/下。在web工程下获取这个路径,可是费了我不少时间。本人在网上搜寻了多种方式,记录在本工程的FilePath.java(服务类)。可以在上传文件页面下点击“查看后台获取文件路径方式”查看。
    不知道怎样把工程附在博客里面,所有上传到CSDN,这是下载地址,http://download.csdn.net/detail/zhangzhuang1127/6742855
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RESTEasy Guice