spring+mybatis+ajax上传下载文件

本文介绍了一种结合Spring、Mybatis和Ajax实现文件上传与下载的方法。前端通过Ajax进行异步交互,服务端使用Spring和Mybatis处理文件操作。详细内容包括前端代码、服务层实现、Spring MVC配置以及相关的数据库设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
/* $(function(){
	$("#upexcel").click(upExcel);
}) */

function upFiles() {
    var formData = new FormData($( "#uploadForm" )[0]);
     $.ajax({
         url: '/files/upFiles.do',
         type: 'POST',
         data: formData,
         async: false,
         cache: false,
         contentType: false,
         processData: false,
         //dataType:'json',
         success: function (returndata) {
             alert(returndata.msg);
         },
         error: function (returndata) {
             alert(returndata);
         }
    });
}

function addFiles(){
	var formData = new FormData();
	for(var i=0; i<$('#file')[0].files.length;i++){
	    formData.append('files', $('#file')[0].files[i]);
	}
	$.ajax({
	   url: "/files/addFiles.do",
	   type: "POST",
	   processData: false,
	   contentType: false,
	   data: formData,
	   success: function (returndata) {
	       alert(returndata.msg);
	   },
	   error: function (returndata) {
	       alert(returndata);
	   }
	});
}

</script>
</head>
<body>

	<form id= "uploadForm">
      <!-- <p >指定文件名: <input type="text" name="fileName" value= ""/></p > -->
      <p >上传单个文件: <input type="file" name="file"/>
      <input type="button"  value="上传" onclick="upFiles()" /></p>
	</form>

	<form enctype="multipart/form-data">    
     <p >上传多个文件:<input  type="file" multiple="multiple" id="file" name="files" >
     <input  type="button" id="btn" value="提交" onclick="addFiles()" /></p>
    </form>

<p><a href="/files/downFiles.do">服务器下载</a></p>
<p><a href="/files/getFiles.do">数据库下载</a></p>

</body>
</html>
controller

package com.web.controller.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import com.entity.files.Files;
import com.service.files.FilesService;
import com.util.IdUtil;
import com.util.Result;

@Controller
@RequestMapping("/files/*")
public class FilesController {
	
	@Resource
	private FilesService filesService;
	
	/**
	 * 一次上传单个文件到服务器和数据库
	 * @param request
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	@RequestMapping("upFiles.do")
	@ResponseBody
	public Result upFiles(HttpServletRequest request) throws IllegalStateException, IOException{
		//String fileName=request.getParameter("fileName");
		// 转型为MultipartHttpRequest:   
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
        // 获得文件:
        MultipartFile file = multipartRequest.getFile("file");
		//获取文件参数
		String files_id=IdUtil.createId();
		String files_origin_name=file.getOriginalFilename();//文件原始名字
		System.out.println("file_name:"+file.getOriginalFilename());
		String files_type=file.getContentType();//文件类型
		String files_server_path="files/"+System.currentTimeMillis()+
				files_origin_name.substring(files_origin_name.indexOf("."));//服务器路径
		byte[] files_content=file.getBytes();//最大2147483647字节
		//存到服务器上
		//String realPath = request.getSession().getServletContext().getRealPath("/files");//servlet下的路径
		//String files_server_path=realPath+System.currentTimeMillis()+files_origin_name.substring(files_origin_name.indexOf("."));
		if(file!=null){
			File filepath=new File(files_server_path);
			if(!filepath.exists()){//判断改路径是否存在
				filepath.mkdirs();
			}
			file.transferTo(new File(files_server_path));
		}
		Files files=new Files();
		files.setFiles_id(files_id);
		files.setFiles_origin_name(files_origin_name);
		files.setFiles_type(files_type);
		files.setFiles_server_path(files_server_path);
		files.setFiles_content(files_content);
/*		在向mysql数据库存储图像文件大于1048576时抛出com.mysql.jdbc.PacketTooBigException: 异常
		  以下是解决方案:
		  我用的MySQL版本是5.0
		  在mysql安装目录下找到my.ini文件,在最后加入一行:
		max_allowed_packet = 10M(该值根据需要设定)
		用dos窗口中使用net stop mysql命令关闭mysql然后重启net start mysql
		重新插入图像(不超过10M),发现问题已经解决了!*/
		Result result=filesService.addFiles(files);
		return result;
	}
	
/*	@RequestMapping("addFiles.do")
	@ResponseBody
	public Result addFiles(HttpServletRequest request) throws Exception {
		// 将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		// 检查form中是否有enctype="multipart/form-data"
		if (multipartResolver.isMultipart(request)) {
			// 将request变成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			// 获取multiRequest 中所有的文件名
			Iterator iter = multiRequest.getFileNames();
			while (iter.hasNext()) {
				// 一次遍历所有文件
				MultipartFile file = multiRequest.getFile(iter.next().toString());
				System.out.println("file.getOriginalFilename():"+file.getOriginalFilename());
				
				if (file != null) {
					String path = "addfiles/" + file.getOriginalFilename();
					File filepath=new File(path);
					if(!filepath.exists()){//判断改路径是否存在
						filepath.mkdirs();
					}
					// 上传
					file.transferTo(new File(path));
				}
			}
		}
		Result result =new Result();
		result.setMsg("成功");
		return result;
	}*/
	
	/**
	 * 一次性上传多个文件
	 * @param request
	 * @param files
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("addFiles.do")
	@ResponseBody
	public Result addFiles(HttpServletRequest request,MultipartFile[] files) throws Exception {
		// 判断file数组不能为空并且长度大于0
		if (files != null && files.length > 0) {
			// 循环获取file数组中得文件
			for (int i = 0; i < files.length; i++) {
				MultipartFile file = files[i];
				// 保存文件
				// 判断文件是否为空
				if (!file.isEmpty()) {
					// 文件保存路径
					String filePath = "addfiles/" + file.getOriginalFilename();
					// 转存文件
					file.transferTo(new File(filePath));
				}
			}
		}
		Result result = new Result();
		result.setMsg("成功");
		return result;
	}
	/**
	 * 从服务器下载文件
	 * @param request
	 * @param response
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("downFiles.do")
	public String downFiles(HttpServletRequest request,HttpServletResponse response) throws IOException{
		Files files=filesService.getFiles();
		request.setCharacterEncoding("UTF-8");
		response.setContentType(files.getFiles_type()+";charset=UTF-8");
		//response.addHeader("Content-Disposition","attachment; filename="+files.getFiles_origin_name());
		response.setHeader("Content-Disposition","attachment; filename="+new String(files.getFiles_origin_name() .getBytes("utf-8"),"iso-8859-1"));//设置文件名字
		System.out.println(files.getFiles_origin_name());
		FileInputStream fis=new FileInputStream(files.getFiles_server_path());//读取文件
		OutputStream os=response.getOutputStream();//创建输出流
		byte[] bt=new byte[1024];
		while(fis.read(bt)!=-1){
			os.write(bt);
		}
		fis.close();
		os.flush();
		os.close();
		return null;
	}
	
	/**
	 * 从数据库下载文件
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@RequestMapping("getFiles.do")
	public void getFiles(HttpServletRequest request,HttpServletResponse response) throws IOException{
		Files files=filesService.getFiles();
		request.setCharacterEncoding("UTF-8");
		response.setContentType(files.getFiles_type()+";charset=UTF-8");
		//response.addHeader("Content-Disposition","attachment; filename="+files.getFiles_origin_name());
		response.setHeader("Content-Disposition","attachment; filename="+new String(files.getFiles_origin_name() .getBytes("utf-8"),"iso-8859-1"));//设置文件名字
		System.out.println(files.getFiles_origin_name());
		FileInputStream fis=new FileInputStream(files.getFiles_server_path());//读取文件
		OutputStream os=response.getOutputStream();//创建输出流
		byte[] bt=files.getFiles_content();
		os.write(bt);
		fis.close();
		os.flush();
		os.close();
	}
	
	
}


service层

package com.service.files;

import com.entity.files.Files;
import com.util.Result;

public interface FilesService {

	public Result addFiles(Files files);
	public Files getFiles();
	
}
service实现层

package com.service.files;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.dao.files.FilesDao;
import com.entity.files.Files;
import com.util.Result;

@Service
public class FilesServiceImpl implements FilesService {

	@Resource
	private FilesDao filesDao;
	
	public Result addFiles(Files files) {
		int addRecorder=filesDao.addFiles(files);
		Result result=new Result();
		if(addRecorder!=1){
			result.setStatus(0);
			result.setMsg("上传数据库失败");
		}else{
			result.setStatus(1);
			result.setMsg("上传数据库成功");
		}
		return result;
	}

	public Files getFiles(){
		Files files=filesDao.getFiles();
		return files;
	}
	
}
实体类

package com.entity.files;

import java.util.Arrays;

import com.entity.base.BaseEntity;

public class Files extends BaseEntity {

	private String files_id;
	private String files_origin_name;
	private String files_server_path;
	private String files_type;
	private byte[] files_content;
	public String getFiles_id() {
		return files_id;
	}
	public void setFiles_id(String files_id) {
		this.files_id = files_id;
	}
	public String getFiles_origin_name() {
		return files_origin_name;
	}
	public void setFiles_origin_name(String files_origin_name) {
		this.files_origin_name = files_origin_name;
	}
	public String getFiles_server_path() {
		return files_server_path;
	}
	public void setFiles_server_path(String files_server_path) {
		this.files_server_path = files_server_path;
	}
	public String getFiles_type() {
		return files_type;
	}
	public void setFiles_type(String files_type) {
		this.files_type = files_type;
	}
	public byte[] getFiles_content() {
		return files_content;
	}
	public void setFiles_content(byte[] files_content) {
		this.files_content = files_content;
	}
	@Override
	public String toString() {
		return "Files [files_id=" + files_id + ", files_origin_name=" + files_origin_name + ", files_server_path="
				+ files_server_path + ", files_type=" + files_type + ", files_content=" + Arrays.toString(files_content)
				+ "]";
	}
	
	
}
dao层

package com.dao.files;

import com.entity.files.Files;

public interface FilesDao {
	
	public int addFiles(Files files);
	public Files getFiles();

}
sql语句

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
  <mapper namespace="com.dao.files.FilesDao">
  
<!-- 传参规则:增加数据记录传实体类,查询和修改较少参数时用map -->

	<!-- 开始:根据传入的条件向files表中插入数据 -->
	<insert id="addFiles" parameterType="com.entity.files.Files" >
	insert into files(files_id,files_origin_name, files_type, files_server_path,files_content) 
	values(#{files_id},#{files_origin_name},#{files_type},#{files_server_path},#{files_content})
	</insert>
	<!-- 开始:根据传入的条件向files表中插入数据 -->
	
   <!-- 开始:根据传入的条件查找files表中的数据 -->
   <select id="getFiles" resultType="com.entity.files.Files">
   	SELECT * FROM files LIMIT 0,1
   </select>
   <!-- 结束:根据传入的条件查找files表中的数据 -->
  	
</mapper> 

配置springmvc

    <!-- 图片获取 maxUploadSize:设置最大限制 字节为单位-->  
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    <property name="maxUploadSize" value="4294967296"></property>  
	</bean>

数据库结构


更多链接:http://www.cnblogs.com/fjsnail/p/3491033.html

http://blog.youkuaiyun.com/swingpyzf/article/details/20230865



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值