java中使用restful web service来传输文件

【1】上传大文件:

	前端页面:  
		1)同步上传:
			<html>  
				<body>  
					<form action="http://localhost:8081/webProject/api/file/uploadFile" method="post" enctype="multipart/form-data">  
					<input type="file" name="targetFile" />  
					<input type="text" name="userName" value="jxn" />  
					<input type="submit" value="提交" />  
					</form>  
				</body>  
			</html>  
	  
		2)异步上传:
			<!DOCTYPE html>
			<html>
				<head>
					<meta charset="UTF-8">
					<title>异步上传文件</title>
				</head>
				<body>
					<form id= "uploadForm" >  
						  上传文件:	<input type="file" name="sendfile"/>
										<input type="button" value="上传" οnclick="doUpload()" />  
					</form>  
					
					<script src="D:\soft\JQuery\jquery-1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
					<script type="text/javascript">
						function doUpload() {  
							 // var formData = new FormData($("#uploadForm")[0]);  
							 var formData = new FormData()
							 formData.append("targetFile",$("#sendfile"));
							 formData.append("userName","test-username");
							 $.ajax({  
								  url: 'http://localhost:8081/webProject/api/file/uploadFile' ,  
								  type: 'POST',  
								  data: formData,  
								  async: false,  
								  cache: false,  
								  contentType: false,  
								  processData: false,  
								  dataType:'json',
								  success: function (data) {  
									  alert(data);  
								  }
							 });  
						}  
					</script>
				</body>
			</html>
		  
		  
	后端:  
	  
		web.xml  
			<servlet>  
				<servlet-name>CXFServlet</servlet-name>  
				<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
				<load-on-startup>1 </load-on-startup>  
			</servlet>  
			<servlet-mapping>  
				<servlet-name>CXFServlet</servlet-name>  
				<url-pattern>/api/*</url-pattern>  
			</servlet-mapping>  
	  
		Spring配置文件:  
			<jaxrs:server id="restFileService" address="/file">  
				<jaxrs:providers>  
					<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />  
				</jaxrs:providers>  
				<jaxrs:serviceBeans>  
					<ref bean="restFileServiceImpl" />  
				</jaxrs:serviceBeans>  
			</jaxrs:server>  
			  
			<bean id="restFileServiceImpl" class="xxx.api.fileprocess.REST.ApiFileProcessServiceImpl" />  
			  
			  
		接口:  
			import org.apache.cxf.jaxrs.ext.multipart.Attachment;  
			import org.apache.cxf.jaxrs.ext.multipart.Multipart;  
		  
			@Path("")  
			public interface ApiFileProcessService {  
				@POST  
				@Path("/uploadFile")  
				@Consumes(MediaType.MULTIPART_FORM_DATA)  
				public String uploadFile(@Multipart(value="targetFile")Attachment targetFile, @Multipart(value="userName")String userName);  
			}  
		  
		实现:  
			import org.apache.cxf.jaxrs.ext.multipart.Attachment;  
			import javax.activation.DataHandler;  
		  
			public class ApiFileProcessServiceImpl implements ApiFileProcessService {  
				  
				@Override  
				public String uploadFile(Attachment targetFile, String userName) {  
					  
					try {  
						DataHandler dataHandler = targetFile.getDataHandler();  
						String originalFileName = new String(dataHandler.getName().getBytes("ISO8859-1"),"UTF-8");  
						InputStream is = dataHandler.getInputStream();  
						  
						SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");  
						String saveLocation = "D:\\" + df.format(new Date()) + "_" + originalFileName;  
								  
						OutputStream out = new FileOutputStream(new File(saveLocation));  
						int read = 0;  
						byte[] bytes = new byte[4096];  
						while ((read = is.read(bytes)) != -1) {  
							out.write(bytes, 0, read);  
						}  
						out.flush();  
						out.close();  
						  
					} catch (Exception e) {  
						e.printStackTrace();  
					}  
					  
					return "success";  
				}  
			}  
			  
		测试结果:可以轻松处理(上传)1G以上的文件。		
			  
      
【2】上传小文件:

	前端页面: 
		<html>
		<body>
			<form action="http://localhost:8081/webProject/api/file/uploadCommonFile" method="post" enctype="multipart/form-data">
			<input type="file" name="file1" />
			<input type="file" name="file2" />
			<input type="submit" value="提交" />
			</form>
		</body>
		</html>

	后端:  
	  
		接口: 
			import javax.ws.rs.core.Context;
			
			@Path("")  
			public interface ApiFileProcessService {  
				@POST
				@Path("/uploadCommonFile")
				@Consumes(MediaType.MULTIPART_FORM_DATA)
				public String uploadCommonFile(@Context HttpServletRequest request);
			}
			
		实现:
			import org.apache.commons.fileupload.FileItem;
			import org.apache.commons.fileupload.disk.DiskFileItemFactory;
			import org.apache.commons.fileupload.servlet.ServletFileUpload;
		  
			public class ApiFileProcessServiceImpl implements ApiFileProcessService {  
				@Override
				public String uploadCommonFile(HttpServletRequest request) {

					try {
						DiskFileItemFactory factory = new DiskFileItemFactory();
						ServletFileUpload fileUpload = new ServletFileUpload(factory);
						List<FileItem> items = fileUpload.parseRequest(request);

						for (FileItem item : items) {
							if (!item.isFormField()) {
								String originalFileName = item.getName();
								
								SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");  
								String saveLocation = "D:\\" + df.format(new Date()) + "_" + originalFileName;  
								
								File picFile = new File(saveLocation);
								item.write(picFile);
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}

					return "success";
				}
			} 


	注意:此方法仅适合上传小文件。


【3】下载文件
	case1:
		接口:	
			import javax.ws.rs.GET;
			import javax.ws.rs.QueryParam;

			@Path("")  
			public interface ApiFileProcessService {  
				@GET
				@Path("/downloadTemplate")
				public Response downloadTemplate(@QueryParam("templateName")templateName );
			}
			
		实现:
			import javax.ws.rs.core.Response;
			import javax.ws.rs.core.Response.ResponseBuilder;
			
			public class ApiFileProcessServiceImpl implements ApiFileProcessService {  
			
				@Override
				public Response downloadTemplate(String templateName) {

					File file = null;
					String fileName = null;
					
					try {
						String applicationPath = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();

						file = new File(applicationPath + "/" + templateName);

						fileName = URLEncoder.encode(templateName, "UTF-8"); // 如果不进行编码,则下载下来的文件名称是乱码
						
					} catch (Exception e) {
						e.printStackTrace();
						return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
					}
					
					ResponseBuilder response = Response.ok((Object) file);
					response.header("Content-Disposition", "attachment; filename=" + fileName);

					return response.build();
				}
			}
			
			
			
	case2:	
		接口:
			
			import javax.ws.rs.*;
			import javax.ws.rs.core.Context;
			
			@GET
			@Path("/exportTest")
			@Produces("application/vnd.ms-excel")
			public Response exportTest(@FormParam("str") String str, @Context HttpServletResponse response);
			
		实现:
			import javax.ws.rs.core.Response;
			import javax.servlet.http.HttpServletResponse;
		
			@Override
			public Response exportTest(String str, HttpServletResponse response) {

				try {
					ServletOutputStream outputStream = response.getOutputStream();

					SXSSFWorkbook wb = new SXSSFWorkbook();
					wb.setCompressTempFiles(true);

					Sheet sheet = wb.createSheet("sheet0");
					Row row = sheet.createRow(0);
					row.createCell(0).setCellValue("hahaha");

					wb.write(outputStream);

					response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode("中文名字.xlsx", "UTF-8"));
					response.setContentType("application/vnd.ms-excel");
					outputStream.close();

				} catch (IOException e) {
					e.printStackTrace();
				}

				return null;
			}
			
			
			
		

		
	

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 什么是Servlet?它的生命周期是怎么样的? Servlet是Java Web的组件,它负责处理客户端请求并生成响应。Servlet的生命周期包括:加载、实例化、初始化、服务、销毁。当Servlet容器启动时,它会加载所有的Servlet类,然后根据web.xml配置文件的<servlet>标签实例化Servlet对象,调用init()方法进行初始化。当客户端发起请求时,容器会调用Servlet的service()方法处理请求。当Servlet容器关闭时,会调用Servlet的destroy()方法销毁对象。 2. 什么是JSP?它和Servlet有什么区别? JSP(JavaServer Pages)是一种动态网页技术,它允许我们在HTML页面嵌入Java代码,以便动态生成HTML内容。与Servlet相比,JSP更容易编写和维护,因为它能够将业务逻辑和展示逻辑分开。Servlet通常用于处理客户端请求和生成响应,而JSP通常用于生成HTML页面。 3. 什么是JDBC?如何使用JDBC连接数据库? JDBC(Java Database Connectivity)是Java连接数据库的标准API,它提供了一组接口和类,用于访问和操作数据库。使用JDBC连接数据库需要以下步骤: 1. 加载数据库驱动程序 2. 创建连接对象 3. 创建Statement对象或PreparedStatement对象 4. 执行SQL语句 5. 处理结果集 6. 关闭Statement对象和连接对象 4. 什么是ORM?常用的ORM框架有哪些? ORM(Object-Relational Mapping)是一种将对象和关系数据库映射的技术,它能够将Java对象和数据库表之间建立映射关系,实现数据的持久化。常用的ORM框架有Hibernate、MyBatis、Spring Data JPA等。 5. 什么是Spring?它的核心模块有哪些? Spring是一个轻量级的Java开发框架,它提供了一系列的模块,用于简化企业级应用程序的开发。Spring的核心模块包括: 1. IOC(Inversion of Control)容器:控制反转容器,用于管理Java对象的生命周期和依赖关系。 2. AOP(Aspect Oriented Programming)框架:面向切面编程框架,用于实现横切关注点的模块化处理。 3. JDBC和ORM模块:用于实现Java与数据库之间的数据访问。 4. MVC框架:用于实现Web应用程序的模型-视图-控制器架构。 5. Spring Security:用于实现安全认证和授权功能。 6. Spring Boot:用于快速构建Spring应用程序的脚手架工具。 6. 什么是RESTful API?如何设计RESTful API? RESTful API是一种基于HTTP协议的Web服务架构,它通过URL来表示资源,使用HTTP方法来定义操作。RESTful API需要满足以下设计原则: 1. 使用HTTP动词来定义操作,如GET、POST、PUT、DELETE等。 2. 使用URI来表示资源,URI应该是有意义的,且应该能够唯一标识资源。 3. 使用HTTP状态码来表示操作结果,如200表示成功,404表示资源不存在等。 4. 使用JSON或XML等格式来传输数据。 7. 什么是Spring Boot?它的优点是什么? Spring Boot是一个快速构建Spring应用程序的脚手架工具,它能够自动配置Spring和第三方库,简化了Spring应用程序的构建和部署。Spring Boot的优点包括: 1. 简化配置:Spring Boot自动配置了很多常用的配置,如数据源、Web服务器、日志等,开发者不需要手动配置。 2. 快速开发:Spring Boot提供了很多快速开发的特性,如自动装配、命令行工具、热部署等,能够提高开发效率。 3. 易于部署:Spring Boot能够将应用程序打包成单个可执行的JAR文件,并且自带内嵌的Web服务器,能够方便地部署和运行。 4. 生态丰富:Spring Boot与Spring生态系统紧密集成,能够方便地使用Spring的各种模块和第三方库。 5. 易于测试:Spring Boot提供了很多测试工具和框架,能够方便地进行单元测试、集成测试等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值