欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jersey中通过ajax进行文件上传

程序员文章站 2022-04-20 21:10:15
...

 

一.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异步上传文件