`

JAX-RS之上传文件

阅读更多
  今天学习的是jax-rs中的上传文件.
1 首先要包含的是resteasy-multipart-provider.jar这个文件

2) 之后是简单的HTML FORM
   <html>
<body>
<h1>JAX-RS Upload Form</h1>

<form action="rest/file/upload" method="post" enctype="multipart/form-data">

  
Select a file : <input type="file" name="uploadedFile" size="50" />
  


   <input type="submit" value="Upload It" />
</form>

</body>
</html>

3 代码如下,先列出,再讲解:
  
 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import org.apache.commons.io.IOUtils;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
 
@Path("/file")
public class UploadFileService {
 
	private final String UPLOADED_FILE_PATH = "d:\\";
 
	@POST
	@Path("/upload")
	@Consumes("multipart/form-data")
	public Response uploadFile(MultipartFormDataInput input) {
 
		String fileName = "";
 
		Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
		List<InputPart> inputParts = uploadForm.get("uploadedFile");
 
		for (InputPart inputPart : inputParts) {
 
		 try {
 
			MultivaluedMap<String, String> header = inputPart.getHeaders();
			fileName = getFileName(header);
 
			//convert the uploaded file to inputstream
			InputStream inputStream = inputPart.getBody(InputStream.class,null);
 
			byte [] bytes = IOUtils.toByteArray(inputStream);
 
			//constructs upload file path
			fileName = UPLOADED_FILE_PATH + fileName;
 
			writeFile(bytes,fileName);
 
			System.out.println("Done");
 
		  } catch (IOException e) {
			e.printStackTrace();
		  }
 
		}
 
		return Response.status(200)
		    .entity("uploadFile is called, Uploaded file name : " + fileName).build();
 
	}
 
	/**
	 * header sample
	 * {
	 * 	Content-Type=[image/png], 
	 * 	Content-Disposition=[form-data; name="file"; filename="filename.extension"]
	 * }
	 **/
	//get uploaded filename, is there a easy way in RESTEasy?
	private String getFileName(MultivaluedMap<String, String> header) {
 
		String[] contentDisposition = header.getFirst("Content-Disposition").split(";");
 
		for (String filename : contentDisposition) {
			if ((filename.trim().startsWith("filename"))) {
 
				String[] name = filename.split("=");
 
				String finalFileName = name[1].trim().replaceAll("\"", "");
				return finalFileName;
			}
		}
		return "unknown";
	}
 
	//save to somewhere
	private void writeFile(byte[] content, String filename) throws IOException {
 
		File file = new File(filename);
 
		if (!file.exists()) {
			file.createNewFile();
		}
 
		FileOutputStream fop = new FileOutputStream(file);
 
		fop.write(content);
		fop.flush();
		fop.close();
 
	}
}

   这里,用户选择了文件上传后,会URL根据REST的特性,自动map
到uploadFile方法中,然后通过:
   Map<String, List<InputPart>> uploadForm = input.getFormDataMap();

List<InputPart> inputParts = uploadForm.get("uploadedFile"); 
   找出所有的上传文件框(可以是多个),然后进行循环工作:
  首先是获得每个文件头的HEADER,用这个
MultivaluedMap<String, String> header = inputPart.getHeaders();
然后在header中取出文件名,这里使用的方法是getFileName,另外写了个方法:

 
   private String getFileName(MultivaluedMap<String, String> header) {
 
		String[] contentDisposition = header.getFirst("Content-Disposition").split(";");
 
		for (String filename : contentDisposition) {
			if ((filename.trim().startsWith("filename"))) {
 
				String[] name = filename.split("=");
 
				String finalFileName = name[1].trim().replaceAll("\"", "");
				return finalFileName;
			}
		}
		return "unknown";
	}



  这里,比较麻烦,要获得header,比如header是如下形式的,然后要再提取其中的文件名:
Content-Disposition=[form-data; name="file"; filename="filename.extension"]
   最后用writeFile写入磁盘.真麻烦呀,还是用spring mvc好.

2
  MultipartForm 的例子,  MultipartForm 中,将上传的文件中的属性配置到
POJO中,例子为:FileUploadForm 类,这个POJO类对应上传的文件类.

  
 import javax.ws.rs.FormParam;
import org.jboss.resteasy.annotations.providers.multipart.PartType;
 
public class FileUploadForm {
 
	public FileUploadForm() {
	}
 
	private byte[] data;
 
	public byte[] getData() {
		return data;
	}
 
	@FormParam("uploadedFile")
	@PartType("application/octet-stream")
	public void setData(byte[] data) {
		this.data = data;
	}
 
}
  


   处理部分就简单多了,可以这样:
Path("/file")
public class UploadFileService {
 
	@POST
	@Path("/upload")
	@Consumes("multipart/form-data")
	public Response uploadFile(@MultipartForm FileUploadForm form) {
 
		String fileName = "d:\\anything";
 
		try {
			writeFile(form.getData(), fileName);
		} catch (IOException e) {
 
			e.printStackTrace();
		}
 
		System.out.println("Done");
 
		return Response.status(200)
		    .entity("uploadFile is called, Uploaded file name : " + fileName).build();
 
	}


  即可.

  但总的感觉,REST有点蛋疼,上传个文件,用SPIRNG MVC或者其他方法都可以了,还用
REST这个方法?
  
2
3
分享到:
评论
4 楼 笛安小六 2016-09-05  
您好,我按照您的方法写完,测试的时候总是报这个错,一直解决不了。请问您遇到过么?
java.lang.RuntimeException: RESTEASY007500: Could find no Content-Disposition header within part
3 楼 Computer521System 2012-07-17  
用的第一种方法、form表单里面还有其他的text。这样应该如何做呢、、?
2 楼 jackyrong 2012-05-18  
搜索下吧,之前按老外例子搞的,搞完删除了
1 楼 570421779 2012-05-17  
最近也在搞resteasy的上传下载,能把resteasy-multipart-provider.jar文件发给我吗?我的邮箱是570421779@qq.com,谢谢

相关推荐

    JAX-RS包(内含1.0和1.4)

    此外,JAX-RS还允许第三方提供实现,如Jersey、RESTEasy等,它们在标准之上提供了额外的功能和便利性。 总结来说,JAX-RS是Java开发REST服务的标准API,通过其提供的注解和接口,开发者可以高效、简洁地构建RESTful...

    JAX-RS web 服务配置及教程

    **Jersey** 是JAX-RS的参考实现之一,它简化了Java中RESTful Web 服务的开发过程。 #### 二、环境搭建 在创建JAX-RS Web服务客户端之前,首先需要完成环境搭建: 1. **下载Eclipse IDE**:选择一个支持Java EE...

    jboss-jaxrs-api_1.1_spec-1.0.0.Final.zip

    综上所述,"jbosss-jaxrs-api_1.1_spec-1.0.0.Final.zip"和"dbDiff.zip"分别代表了Java RESTful服务的规范和一个数据库模式比较工具。这两个组件在现代软件开发中扮演着重要角色,前者用于构建Web服务,后者用于...

    jaxrs2-exercise-jersey-servlet:JAX-RS 2.0 练习在 Servlet 容器中使用 Jersey 2.x

    这个项目中的"jaxrs2-exercise-jersey-servlet"就展示了如何进行这样的配置。 1. **Jersey与Servlet容器集成** - 首先,需要在`web.xml`配置文件中定义一个Servlet,将Jersey的`Application`类注册为Servlet。`...

    restful_simple_example:带有 Maven、JAX-RS、JAXB、EASTeasy 的 RESTful Web 服务的简单示例 ..

    在`pom.xml`文件中,你可以看到项目的依赖列表,如JAX-RS和JAXB库,Maven会自动下载这些库并将其包含在构建过程中。 2. **JAX-RS**: JAX-RS(Java API for RESTful Web Services)是Java标准,用于简化创建...

    JAXRS-Jersey:Jersey Maven Eclipse 动态 Web 项目,遵循 JAX-RS 规范,具有 mysql 数据库后端和基于 angular-js 的前端

    `JAXRS-Jersey-master`这个压缩包包含了整个项目的所有源代码和配置文件。主要文件夹可能包括以下几个部分: 1. `src/main/java`:存放Java源代码,包括Jersey的REST服务类和业务逻辑处理。 2. `src/main/webapp`:...

    JAVA的WebService支持.pdf

    - **WS-MetaData(JSR181)**是JAX-WS的依赖规范之一,用于配置公开的WebService相关信息和SOAP消息的配置,其API位于`javax.jws.*`包。 2. **JAXM&SAAJ** - **JAXM(Java API for XML Messaging)**定义了用于...

    NCC-OpenAPI示例文档.zip

    UAP在Restlet框架之上,选择了官方JAX-RS扩展,并且在扩展的基础上与NC进行了集成。 主要jar包 modules/uapws/pubuapfw_restframeworkLevel-1.jar UAP平台的扩展主要集中在uap.ws.*中,同时还少量修改了官方的jax-rs...

    WebService调用技术文档

    1. **服务发布**:服务提供者将服务以WSDL形式发布到网络上,WSDL文件描述了服务的接口、消息格式和地址。 2. **服务发现**:服务消费者通过UDDI查找服务,或者直接获取WSDL文件。 3. **服务绑定**:消费者解析...

    cxf服务端和客户端所需jar包

    CXF的核心功能之一是提供对JAX-WS和JAX-RS规范的实现。JAX-WS用于创建基于SOAP的Web服务,而JAX-RS则用于创建RESTful Web服务。这些规范的实现需要相应的jar包,如`cxf-rt-frontend-jaxws.jar`和`cxf-rt-rs-service...

    Jersey User Guild

    Jersey 是一个开源的 JAX-RS (Java API for RESTful Web Services) 实现,用于构建 RESTful Web 服务和微服务。它由 Apache 软件基金会提供支持,是 Java 社区中用于 RESTful 服务开发的主要工具之一。Jersey 用户...

    web Service 实例教程

    3. **JAX-RS**(Java API for RESTful Web Services):JAX-RS是基于Java的RESTful Web服务规范,用于创建REST风格的Web服务。 ### 开发工具 开发Java Web服务通常使用集成开发环境(IDE)如Myeclipse10。此外,还...

    jersey-1.19.1相关jar包

    1. **jersey-server-1.19.1.jar**:这是Jersey的核心组件之一,提供了实现JAX-RS服务器端功能的类和接口。它负责处理HTTP请求,映射到资源方法,执行这些方法,并生成响应。 2. **jersey-core-1.19.1.jar**:这个库...

    jersey-server-linking-1.18.1.zip

    JAX-RS 是 Java 平台上的标准,它简化了创建具有 RESTful 特性的 web 应用程序的过程。 1. **Jersey 框架**:Jersey 提供了一套全面的工具和功能,包括自动资源发现、注解驱动的编程模型、过滤器、容器内嵌支持以及...

    apache-cxf-3.5.0.zip

    - **JAX-RS**: 对于RESTful服务,CXF提供了JAX-RS实现,通过简单的注解,可以将Java方法映射到HTTP请求上,支持GET、POST等多种HTTP方法。 4. **CXF的优势** - **易于集成**: CXF可以很好地与Spring框架集成,...

    jersey1.17实例

    JAX-RS 是 Java 平台上实现 RESTful 服务的标准接口,而 Jersey 则是 JAX-RS 规范的实现之一。 ### 2. Jersey 1.17 的核心组件 - **Resource Classes**: 这些是包含 HTTP 方法(如 GET、POST、PUT、DELETE 等)的 ...

    Building-Web-Services-with-Java.zip_building_web services

    文件列表中的"Building Web Services with Java"可能包含了JAX-RS示例,展示如何创建和消费RESTful服务。 4. **Spring框架**:Spring框架是Java开发中广泛使用的工具,尤其在构建Web服务时。Spring Boot简化了设置...

    apache-cxf-3.3.1

    CXF提供了全面的JAX-RS实现,包括注解驱动的API和客户端库,使得开发者可以快速地创建和消费RESTful服务。 4. **多种协议支持**:CXF不仅限于SOAP,还支持各种其他通信协议,如HTTP、HTTPS、JMS、XMPP等,这为服务...

    利用STP构建 Web Service(SOA)

    该插件支持 JAX-WS、JAX-RS、SOAP、RESTful 等多种 Web Service 技术,并提供了丰富的编辑、调试和测试功能。 #### 3. 构建示例应用 为了更好地理解如何使用 Eclipse STP 构建 Web Service,我们将创建一个简单的...

    CXF restful风格WebService

    &lt;jaxrs:serviceBeans&gt; &lt;/jaxrs:serviceBeans&gt; &lt;/jaxrs:server&gt; ``` 4. **启动服务**:运行项目,CXF会根据配置启动一个HTTP服务器,监听指定的端口,并提供RESTful服务。 5. **测试服务**:可以通过浏览器、...

Global site tag (gtag.js) - Google Analytics