- 浏览: 7948644 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
今天学习的是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 代码如下,先列出,再讲解:
这里,用户选择了文件上传后,会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,另外写了个方法:
这里,比较麻烦,要获得header,比如header是如下形式的,然后要再提取其中的文件名:
Content-Disposition=[form-data; name="file"; filename="filename.extension"]
最后用writeFile写入磁盘.真麻烦呀,还是用spring mvc好.
2
MultipartForm 的例子, MultipartForm 中,将上传的文件中的属性配置到
POJO中,例子为:FileUploadForm 类,这个POJO类对应上传的文件类.
处理部分就简单多了,可以这样:
即可.
但总的感觉,REST有点蛋疼,上传个文件,用SPIRNG MVC或者其他方法都可以了,还用
REST这个方法?
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这个方法?
评论
4 楼
笛安小六
2016-09-05
您好,我按照您的方法写完,测试的时候总是报这个错,一直解决不了。请问您遇到过么?
java.lang.RuntimeException: RESTEASY007500: Could find no Content-Disposition header within part
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,谢谢
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1587方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 2021前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3474info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2238import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 492https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 694public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 617https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 672https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 439https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 5451 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3108微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 620https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1846什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 969本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1365原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 866public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 675在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 942-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 774一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1909介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
此外,JAX-RS还允许第三方提供实现,如Jersey、RESTEasy等,它们在标准之上提供了额外的功能和便利性。 总结来说,JAX-RS是Java开发REST服务的标准API,通过其提供的注解和接口,开发者可以高效、简洁地构建RESTful...
**Jersey** 是JAX-RS的参考实现之一,它简化了Java中RESTful Web 服务的开发过程。 #### 二、环境搭建 在创建JAX-RS Web服务客户端之前,首先需要完成环境搭建: 1. **下载Eclipse IDE**:选择一个支持Java EE...
综上所述,"jbosss-jaxrs-api_1.1_spec-1.0.0.Final.zip"和"dbDiff.zip"分别代表了Java RESTful服务的规范和一个数据库模式比较工具。这两个组件在现代软件开发中扮演着重要角色,前者用于构建Web服务,后者用于...
这个项目中的"jaxrs2-exercise-jersey-servlet"就展示了如何进行这样的配置。 1. **Jersey与Servlet容器集成** - 首先,需要在`web.xml`配置文件中定义一个Servlet,将Jersey的`Application`类注册为Servlet。`...
在`pom.xml`文件中,你可以看到项目的依赖列表,如JAX-RS和JAXB库,Maven会自动下载这些库并将其包含在构建过程中。 2. **JAX-RS**: JAX-RS(Java API for RESTful Web Services)是Java标准,用于简化创建...
`JAXRS-Jersey-master`这个压缩包包含了整个项目的所有源代码和配置文件。主要文件夹可能包括以下几个部分: 1. `src/main/java`:存放Java源代码,包括Jersey的REST服务类和业务逻辑处理。 2. `src/main/webapp`:...
- **WS-MetaData(JSR181)**是JAX-WS的依赖规范之一,用于配置公开的WebService相关信息和SOAP消息的配置,其API位于`javax.jws.*`包。 2. **JAXM&SAAJ** - **JAXM(Java API for XML Messaging)**定义了用于...
UAP在Restlet框架之上,选择了官方JAX-RS扩展,并且在扩展的基础上与NC进行了集成。 主要jar包 modules/uapws/pubuapfw_restframeworkLevel-1.jar UAP平台的扩展主要集中在uap.ws.*中,同时还少量修改了官方的jax-rs...
1. **服务发布**:服务提供者将服务以WSDL形式发布到网络上,WSDL文件描述了服务的接口、消息格式和地址。 2. **服务发现**:服务消费者通过UDDI查找服务,或者直接获取WSDL文件。 3. **服务绑定**:消费者解析...
CXF的核心功能之一是提供对JAX-WS和JAX-RS规范的实现。JAX-WS用于创建基于SOAP的Web服务,而JAX-RS则用于创建RESTful Web服务。这些规范的实现需要相应的jar包,如`cxf-rt-frontend-jaxws.jar`和`cxf-rt-rs-service...
Jersey 是一个开源的 JAX-RS (Java API for RESTful Web Services) 实现,用于构建 RESTful Web 服务和微服务。它由 Apache 软件基金会提供支持,是 Java 社区中用于 RESTful 服务开发的主要工具之一。Jersey 用户...
3. **JAX-RS**(Java API for RESTful Web Services):JAX-RS是基于Java的RESTful Web服务规范,用于创建REST风格的Web服务。 ### 开发工具 开发Java Web服务通常使用集成开发环境(IDE)如Myeclipse10。此外,还...
1. **jersey-server-1.19.1.jar**:这是Jersey的核心组件之一,提供了实现JAX-RS服务器端功能的类和接口。它负责处理HTTP请求,映射到资源方法,执行这些方法,并生成响应。 2. **jersey-core-1.19.1.jar**:这个库...
JAX-RS 是 Java 平台上的标准,它简化了创建具有 RESTful 特性的 web 应用程序的过程。 1. **Jersey 框架**:Jersey 提供了一套全面的工具和功能,包括自动资源发现、注解驱动的编程模型、过滤器、容器内嵌支持以及...
- **JAX-RS**: 对于RESTful服务,CXF提供了JAX-RS实现,通过简单的注解,可以将Java方法映射到HTTP请求上,支持GET、POST等多种HTTP方法。 4. **CXF的优势** - **易于集成**: CXF可以很好地与Spring框架集成,...
JAX-RS 是 Java 平台上实现 RESTful 服务的标准接口,而 Jersey 则是 JAX-RS 规范的实现之一。 ### 2. Jersey 1.17 的核心组件 - **Resource Classes**: 这些是包含 HTTP 方法(如 GET、POST、PUT、DELETE 等)的 ...
文件列表中的"Building Web Services with Java"可能包含了JAX-RS示例,展示如何创建和消费RESTful服务。 4. **Spring框架**:Spring框架是Java开发中广泛使用的工具,尤其在构建Web服务时。Spring Boot简化了设置...
CXF提供了全面的JAX-RS实现,包括注解驱动的API和客户端库,使得开发者可以快速地创建和消费RESTful服务。 4. **多种协议支持**:CXF不仅限于SOAP,还支持各种其他通信协议,如HTTP、HTTPS、JMS、XMPP等,这为服务...
该插件支持 JAX-WS、JAX-RS、SOAP、RESTful 等多种 Web Service 技术,并提供了丰富的编辑、调试和测试功能。 #### 3. 构建示例应用 为了更好地理解如何使用 Eclipse STP 构建 Web Service,我们将创建一个简单的...
<jaxrs:serviceBeans> </jaxrs:serviceBeans> </jaxrs:server> ``` 4. **启动服务**:运行项目,CXF会根据配置启动一个HTTP服务器,监听指定的端口,并提供RESTful服务。 5. **测试服务**:可以通过浏览器、...