`

Jersey中通过ajax进行文件上传

阅读更多

 

一.Rest接口:

 

package com.zjtachao.wcad.dsp.cs.rest.resource;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;

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.MediaType;

import org.apache.commons.io.FileUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

import com.zjtachao.framework.common.util.json.JsonObject.ResultCode;
import com.zjtachao.framework.common.util.rest.RestContents;
import com.zjtachao.framework.common.util.tools.UploadFileUtil;
import com.zjtachao.framework.pojo.rest.RestObject;
import com.zjtachao.wcad.dsp.cs.pojo.ro.DspCsMaterialImgRo;
import com.zjtachao.wcad.dsp.cs.rest.resource.base.BaseResource;
import com.zjtachao.wcad.dsp.cs.util.constants.DspCsCommonConstants;
import com.zjtachao.wcad.dsp.cs.util.tools.DspCsValidateUtil;

@Path("/upload")
public class DspAdUploadResourceImpl extends BaseResource {

    
    /**
	 * 使用普通的流的形式上传:调用UploadFileUtil.uploadImage
	 * @param filename
	 * @param uploadedInputStream
	 * @param fileDetail
	 * @return
	 */
	@POST
	@Path("/file")
	@Consumes(MediaType.MULTIPART_FORM_DATA)
	@Produces(RestContents.MEDIA_TYPE_APPLICATION_JSON_UTF8)
	public RestObject<DspCsMaterialImgRo> uploadFile(
			@FormDataParam("file") InputStream uploadedInputStream,@FormDataParam("file") FormDataContentDisposition fileDetail) {
		RestObject<DspCsMaterialImgRo> rest = new RestObject<DspCsMaterialImgRo>();
		rest.setCode(ResultCode.VALID_NO_PASS.getCode());
		try{
			if((null != uploadedInputStream) && (null != fileDetail)){
				String fileName = fileDetail.getFileName();														
				//验证格式是否正确(支持 jpg/png/gif)
				if(DspCsValidateUtil.validateImgFileType(fileName)){
					//获取图片本地路径
					String imgPath = configUtil.getConfigByKey(DspCsCommonConstants.COM_ZJTACHAO_WCAD_MATERIAL_IMG_PATH);
					//上传之后的相对路径
					String filePath = UploadFileUtil.uploadImage(imgPath, uploadedInputStream, fileName);
					//上传之后的URL
					String headImgUrl = configUtil.getConfigByKey(DspCsCommonConstants.COM_ZJTACHAO_WCAD_MATERIAL_IMG_URL_PREFIX);							
					//返回物料对象
					DspCsMaterialImgRo ro = new DspCsMaterialImgRo();
					ro.setMaterialImgUrl(headImgUrl+filePath);
					rest.setCode(ResultCode.SUCCESS.getCode());
					rest.setMsg("上传成功!");
					rest.setRst(ro);
				}else{
					rest.setMsg("上传失败!原因:图片格式只能为jpg、png、gif格式!");
				}
			}else{
				rest.setMsg("上传失败!原因:图片数据不能为空!");
			}
		}catch(Exception ex){
			rest.setCode(ResultCode.ERROR.getCode());
			rest.setMsg("上传失败!原因:服务器出错!");
			logger.error("上传物料失败!",ex);
		}		
		return rest;
	}
	
	
	/** 
     * 使用FileUtils.copyInputStreamToFile方式上传 
     * 
     * @param fileInputStream 
     * @param disposition 
     * @return 
     */  
    @POST  
    @Path("uploadimage1 ")  
    @Consumes(MediaType.MULTIPART_FORM_DATA)  
    public String uploadimage1(@FormDataParam("file") InputStream fileInputStream,  
        @FormDataParam("file") FormDataContentDisposition disposition) {  
    	
    	String imageName = Calendar.getInstance().getTimeInMillis() + disposition.getFileName();  
  
    	File file = new File(imageName);  
	    try {  
	        //使用common io的文件写入操作(注:需要2.2以上版本的commons-io包)
	        FileUtils.copyInputStreamToFile(fileInputStream, file);  
	        //原来自己的文件写入操作  
	        //saveFile(fileInputStream, file);  
	    } catch (IOException ex) {  
	    	//TODO
	    }  
	  
	    return "images/" + imageName;  
    }  
    
    
    // 保存文件信息到磁盘   
    private void saveFile(InputStream uploadedInputStream, File file) {  
	    try {  
	        OutputStream outpuStream = new FileOutputStream(file);  
	        int read = 0;  
	        byte[] bytes = new byte[1024];  
	        //outpuStream = new FileOutputStream(new File(serverLocation));  
	        while ((read = uploadedInputStream.read(bytes)) != -1) {  
	        outpuStream.write(bytes, 0, read);  
	        }  
	        outpuStream.flush();  
	        outpuStream.close();  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	    }  
    }  
  
}
注意:若使用FileUtils.copyInputStreamToFile方式,需要2.2以上版本的commons-io包
如下:
<!-- Apache Commons -->
<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.2</version>
</dependency>
 

二.UploadFileUtil文件上传工具类:

 

package com.zjtachao.framework.common.util.tools;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;

 /**
 * 上传文件工具类
 */
public class UploadFileUtil {
	
	
	/**
	 * 上传图片的方法
	 * @param imageFile
	 * @param imageName
	 * @return
	 * @throws IOException
	 */
	public static String uploadImage(String path, File imageFile, String imageName) throws IOException {
		/*创建输入流*/  
		InputStream is = new FileInputStream(imageFile); 
		return uploadImage(path, is, imageName);
	}
	
	/**
	 * 
	   * 上传图片的方法
	   * @param path
	   * @param inputStream
	   * @param imageName
	   * @return
	   * @throws IOException
	 */
	public static String uploadImage(String path, InputStream inputStream, String imageName) throws IOException {
		int random = (int)(Math.random()*900)+100; 
		/*设置上传目录*/  
		Calendar cal=Calendar.getInstance();
		String month = String.valueOf(cal.get(Calendar.MONTH)+1);
		month = month.length() == 1 ? "0" + month : month;
		String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
		day = day.length() == 1 ? "0" + day : day;
		String imageUrlPath = "images" + "/" + cal.get(Calendar.YEAR) + "/" + month + "/" + day;
		String imagePath = path + imageUrlPath;
		File file = new File(imagePath);
		if (!file.exists()) {
			file.mkdirs();
		}
		/*设置目标文件*/  
		String targetImageName = "" + cal.get(Calendar.HOUR) + cal.get(Calendar.MINUTE) + cal.get(Calendar.SECOND) 
				+ cal.get(Calendar.MILLISECOND) + random + imageName.substring(imageName.lastIndexOf("."));
		File target = new File(imagePath + "/" + targetImageName);
		/*创建输出流*/  
		OutputStream os = new FileOutputStream(target);  
		byte[] buffer = new byte[1024];  
		int length = 0;  
		while ((length = inputStream.read(buffer)) > 0) {  
		    os.write(buffer, 0, length);  
		}  
		inputStream.close();  
		os.close();  
		return "/" + imageUrlPath + "/" + targetImageName;
	}

}

 

 

三.DspValidateUtil验证工具类:

/**
	 * 
	   * 验证图片类型
	   * @param fileName
	   * @return
	 */
	public static boolean validateImgFileType(String fileName){
		boolean flag = false;
		if((null != fileName) && (!"".equals(fileName))){
			int index = fileName.lastIndexOf(".");
			if(index > 0){
				String type = fileName.substring(index+1);
				if((null != type) && 
						(type.equalsIgnoreCase("jpg")
								|| type.equalsIgnoreCase("png")
								|| type.equalsIgnoreCase("gif"))){
					flag = true;
				}
			}
		}
		return flag;
	}

 

 

三.Form表单:

<form id="form" enctype="multipart/form-data" method="post" action="${base}/news/addImage">
	<div>
	 	<div id="imageDiv">
		 	<input id="image" name="file" title="上传图片" type="file" multiple accept="image/*"  onchange="handleFiles(this)">
		 	<input type="button" value="删除" onclick="deleteImage()"/>
	 	</div>
	 	<div id="previewImage" align="center"></div>
 	</div>
 	
 	<input type="button" value="保存" class="btn btn-large btn-danger" onclick="doSubmit()"/>
 	<input id="size" type="hidden"/>

</form>

 

 

四.普通上传——form表单提交方式:

function doSubmit(){
	var size = $("#size").val();
	if(size > 104857600){
		$("#msg").text("上传的图片尺寸过大");
		return;
	}
	$("#form").submit();
}

 

 

五.Ajax上传:

function upload(obj) {
	var formData = new FormData($("#form")[0]);
	$.ajax({
		url: "http://192.168.1.1/webapp/rest/upload/image",
		type: "POST",
		data: formData,
		async: false,
		cache: false,
		contentType: false,
		processData: false,
		success: function (data) {
			//预览
			previewImage(obj);
		}
	});
}

 

 

六.预览:

function handleFiles(obj) {
	var files = obj.files;
	var size = files[0].size;
	$("#size").val(size);
		img = new Image();
	if(window.URL){
	      img.src = window.URL.createObjectURL(files[0]); 
	      img.onload = function(e) {
	         window.URL.revokeObjectURL(this.src); 
	      }
	      $("#previewImage").append(img);
	}else if(window.FileReader){
		var reader = new FileReader();
		reader.readAsDataURL(files[0]);
		reader.onload = function(e){
			img.src = this.result;
			$("#previewImage").append(img);
		}
	}else{
		obj.select();
		obj.blur();
		var nfile = document.selection.createRange().text;
		document.selection.empty();
 		img.src = nfile;
		img.onload=function(){
	    }
		$("#previewImage").append(img);
	}
}

 

 

参考:

jersey 文件上传-使用两种不同的方式

jQuery异步上传文件

分享到:
评论

相关推荐

    jersey webapp ajax demo

    【标题】:“jersey webapp ajax demo”是一个展示如何在Java Web应用中使用Jersey框架与Ajax技术进行交互的示例项目。这个项目是通过Maven构建系统来管理依赖和构建流程的,使得开发者能够快速地搭建和测试RESTful...

    SpringBoot第 6 讲:SpringBoot+jersey跨域文件上传

    在本教程中,我们将深入探讨如何使用Spring Boot与Jersey实现跨域文件上传。Spring Boot以其简化Spring应用程序开发的特性而受到广泛欢迎,而Jersey是JAX-RS规范的一个实现,用于构建RESTful Web服务。当我们谈论...

    巧用 Jersey RESTful WebService框架解决文件上传乱码

    通过以上步骤,我们可以有效地解决文件上传过程中可能出现的乱码问题。在实际开发中,还需要考虑其他因素,比如错误处理、文件大小限制等,以确保服务的稳定性和安全性。同时,利用Maven管理项目依赖和构建流程,...

    springmvc远程上传文件jersey-client

    在这个场景中,我们将探讨如何在Spring MVC中利用Jersey Client实现远程文件上传功能。 首先,我们需要理解Spring MVC的文件上传机制。Spring MVC提供了`MultipartFile`接口,用于处理HTTP请求中的多部分数据,包括...

    jersey 文件上传-使用两种不同的方式

    在使用Jersey处理文件上传时,你可以选择使用内置的`MultiPartFeature`,也可以通过自定义`MessageBodyReader`实现更灵活的控制。无论哪种方式,关键在于理解和利用Jersey提供的API来处理HTTP请求的多部分数据。在...

    jersey+spring+srpingmvc实现上传

    在文件上传中,Spring MVC可以解析上传请求,将文件内容绑定到模型对象上,然后调用相应的服务进行处理。 4. **文件上传流程**: - 客户端通过HTTP POST请求发送文件。 - Spring MVC的Controller接收到请求,解析...

    jersey+spring实例代码(包括文件上传)

    在本实例中,文件上传功能可能使用了Jersey的Multipart support,基于`@FormDataParam`注解来接收上传的文件。这个功能涉及到以下几点: 1. **MIME类型**:文件上传需要识别和处理不同类型的文件,这通常通过MIME...

    Jersey文件传输的文档及案例

    本文将深入探讨如何使用Jersey处理文件上传和下载,这在许多应用场景中,如云存储、文件共享服务等,都是至关重要的功能。 首先,我们需要了解REST(Representational State Transfer)的核心概念,它是一种架构...

    jersey上传文件代码

    标题 "jersey上传文件代码" 涉及到的是使用Jersey框架进行文件上传的编程实践。Jersey是Java RESTful Web服务(JAX-RS)的实现,它允许开发者创建和消费RESTful API。在描述中提到,这部分的知识点可能来自于英文...

    Jersey+Jetty框架简单搭建(包含文件上传下载)

    4. **配置 Jersey**:在 `web.xml` 文件中配置 Jersey 作为 Servlet 处理器。添加如下内容: ```xml &lt;servlet-name&gt;Jersey Web Application &lt;servlet-class&gt;org.glassfish.jersey.servlet.ServletContainer ...

    SpringBoot+Jersey可连数据库,可上传图片代码

    例如,可以通过MultipartFile的isEmpty()方法检查文件是否为空,通过contentType属性判断文件类型,以及在保存前进行文件大小的验证。 总的来说,SpringBoot和Jersey结合使用,可以快速构建出功能丰富的RESTful服务...

    jersey-core、jersey-client jar包.rar

    在Spring MVC中,可以使用jersey-client来创建一个客户端代理,与远程服务器进行通信,实现文件的上传功能。 在实现跨服务器文件上传时,首先需要配置jersey-client,设置目标服务器的URL、HTTP方法(通常是POST)...

    Jersey实现restful,CXF调用以及jquery AJAX调用

    本篇将详细介绍如何使用Jersey框架实现RESTful服务,以及如何通过CXF客户端进行调用,并探讨jQuery AJAX如何与这些服务进行交互。 1. **Jersey与RESTful服务** Jersey是Java平台上的一个开源项目,它是JAX-RS...

    springMVC+jersey实现跨服务器文件上传

    在开发Web应用时,文件上传是一项常见的功能,特别是在分布式系统中,跨服务器文件上传尤为重要。本文将详细讲解如何使用SpringMVC与Jersey框架来实现这一功能。 首先,要实现跨服务器文件上传,我们需要在...

    jersey文件下载

    要实现在Spring和Jersey中进行文件下载,我们需要以下步骤: 1. **配置Spring和Jersey**: - 引入jersey-spring3依赖,确保Spring容器能够管理Jersey的组件。 - 配置JerseyServlet,通常在web.xml中定义一个...

    文件上传下载服务springboot实现

    下载文件: 运行jersey-server, 不设置端口的情况下,默认为8080,springboot jar运行方式下默认端口为9000 ...文件路径分割符号请用/替代\...上传下载文件大小在工程jersey-server的配置文件application.properties里设置

    jersey所有的jar包

    5. **jersey-media-multipart**: 支持MIME多部分类型的数据传输,例如上传文件。 6. **jersey-guava**: 引入Google Guava库,提供了一些实用工具类和集合类,增强Jersey的功能。 7. **jersey-hk2**: 依赖于HK2...

    jersey-1.19JAR包全

    8. **jersey-media-multipart**:支持文件上传和下载的多部分/表单数据处理。 9. **jersey-common**:通用工具和功能,如注入、类型转换等。 10. 其他可能的依赖库,如JSR-311规范实现、Apache HttpClient等。 总的...

    jersey框架下载功能

    总的来说,使用Jersey处理POST请求中的表单数据并实现下载功能涉及以下几个关键点:使用`@FormParam`获取参数,通过`StreamingOutput`提供文件内容,以及设置正确的HTTP响应头。理解这些概念和实践将有助于你在构建...

Global site tag (gtag.js) - Google Analytics