Spring上传/下载(已解决中文乱码)

Spring上传/下载

废话不多说,直接贴代码,其中依赖mhdt-common.jar可自行下载或引用。

后台 xxxController.java:

package online.sanen.website.common.controller;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.mhdt.net.RequestResult;
import com.mhdt.net.RequestResult.Status;
import com.mhdt.toolkit.DateUtility;
import com.mhdt.toolkit.FileUtility;
import com.mhdt.toolkit.PathUtil;

import online.sanen.website.common.model.Resource;
import online.sanen.website.common.service.ResourceService;
import online.sanen.website.common.util.ResponseUtil;

@Controller
@RequestMapping("resource")
public class ResourceController {
	
	static {
		File file = new File(PathUtil.underCurrentProject() + "/resource");
		if(!file.exists())
			FileUtility.createFloder(file);
	}

	@Autowired
	ResourceService service;

	@RequestMapping("upload")
	@ResponseBody
	public RequestResult fileUpload(@RequestParam("pic")MultipartFile file, HttpServletRequest request) {
		
		Resource resource = new Resource();
		resource.setName(file.getOriginalFilename().split("\\.")[0]);
		resource.setSuffix(file.getOriginalFilename().split("\\.")[1]);
		resource.setTime(DateUtility.getNow());
		
		try {
			File f = new File(PathUtil.underCurrentProject() + "/resource/" + file.getOriginalFilename());
			System.out.println(f.getAbsolutePath());
			file.transferTo(f);
			service.insert(resource);
			String projectPath = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
			return RequestResult.status(Status.SUCCESS).message("上传成功!").putAttribute("url", projectPath+"/resource/download?filename="+file.getOriginalFilename());
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
			return RequestResult.status(Status.SUCCESS).message("上传失败:"+e.getMessage());
		}
	}

	@RequestMapping("download")
	public void fileDownload(HttpServletResponse response, String filename) {

		File file = new File(PathUtil.underCurrentProject()+"/resource/" + filename);

		System.out.println(file.getAbsolutePath());
		if (!file.exists() && !file.isFile())return;

		response.setContentType("application/octet-stream;charset=UTF-8");

		ResponseUtil.setDownloadHead(response, file);

		try {
			ResponseUtil.transfer(response, file);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
ReponseUtil.java
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import com.mhdt.toolkit.DateUtility;
import com.mhdt.toolkit.FileUtility;

public class ResponseUtil {
	
	public  static void validatePath(String path) {
		File file = new File(path);
		if(!file.exists())
			FileUtility.createFloder(file);
	}
	
	public static void setDownloadHead(HttpServletResponse response,File file) {
		 try {
			 	response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
			} catch (UnsupportedEncodingException e1) {
				response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
			}  
			response.setContentLengthLong(file.length()); 
	}
	
	public static void transfer(HttpServletResponse response,File file) {
		
		byte[] buff = new byte[1024];
		BufferedInputStream bis = null;
		OutputStream os = null;
		try {
			os = response.getOutputStream();
			bis = new BufferedInputStream(new FileInputStream(file));
			int i = bis.read(buff);
			while (i != -1) {
				os.write(buff, 0, buff.length);
				os.flush();
				i = bis.read(buff);
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("Exception->"+e.getMessage()+"->"+DateUtility.getNow());
		} finally {
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
spring配置(解决中文乱码)
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="104857600" />
		<property name="maxInMemorySize" value="104857600" />
		<property name="defaultEncoding" value="UTF-8" />
	</bean>

前台JS (以作参考)

这里用的 jquery+jquery.form 其它方案无视


	<script src="/assets/js/jquery.form.js"></script>
	

function uploadPic(){
	var options = {  
		url: "${ctx}/resource/upload",  
	        type: "post",  
	        dataType: "json",  
	        contentType: "application/x-www-form-urlencoded; charset=utf-8", 
	        success: function(result) {
	        	var status = result.status;
	              	var data = result.data;
	                alert(data.url);
	         }  
	   };  
	          
	 $("#imgForm").ajaxSubmit(options);  
}
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值