RESTEasy实现上传下载文件

    近期,使用RESTEasy实现了上传下载文件。这次我是使用guice来注册服务,要想使用guice来注册服务,需要修改web.xml:

将:

  
	resteasy.scan  
	true  
  
  
  
	  
		org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap  
	   
  
修改成:

    resteasy.guice.modules
    org.oliver.module.FileModule
  
  
  
    
            org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
    
  

配置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、上传文件页面设计如下:

文件名:
文件:


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/,进入如下页面:

RESTEasy实现上传下载文件_第1张图片

    点击“提交”,返回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,就能成功下载图片
RESTEasy实现上传下载文件_第2张图片


附录

    下载文件放在WebContent/file/下。在web工程下获取这个路径,可是费了我不少时间。本人在网上搜寻了多种方式,记录在本工程的FilePath.java(服务类)。可以在上传文件页面下点击“查看后台获取文件路径方式”查看。
    不知道怎样把工程附在博客里面,所有上传到CSDN,这是下载地址, http://download.csdn.net/detail/zhangzhuang1127/6742855


你可能感兴趣的:(RESTEasy,RESTEasy,Guice)