参考

Spring MVC中上传文件实例

SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传

Spring MVC 文件上传下载 (FileOperateUtil.java 压缩,重命名工具类)

controller代码

@Controller
@RequestMapping(value = "/file")
public class FileController extends BaseController {
/**
* 上传文件
*
* @return JSON
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "/upload")
public Message upload(HttpServletRequest request,
HttpServletResponse response) throws Exception {
logBefore(logger, "上传文件"); Message message = new Message();
PageData pd = new PageData();
pd = this.getPageData(); // 这里实现文件上传操作用的是commons.io.FileUtils类,它会自动判断/upload是否存在,不存在会自动创建
String realPath = request.getSession().getServletContext() .getRealPath("/upload/file");
logBefore(logger, "realPath: " + realPath); // 上传文件的原名(即上传前的文件名字)
String originalFilename = null;
// 如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解
// 如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且要指定@RequestParam注解
// 上传多个文件时,前台表单中的所有<input
// type="file"/>的name都应该是file,否则参数里的file无法获取到所有上传的文件
MultipartFile file = FileUpload.getMultipartFileByName(request, "file");
if (file.isEmpty()) {
message.response = ResponseStatus.FAILED.getStatus();
message.message = "请选择文件后上传!";
} else {
originalFilename = file.getOriginalFilename();
logBefore(logger, "文件原名: " + originalFilename);
logBefore(logger, "文件名称: " + file.getName());
logBefore(logger, "文件长度: " + file.getSize());
logBefore(logger, "文件类型: " + file.getContentType());
logBefore(logger, "========================================");
try {
// 这里不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉
// 此处也可以使用Spring提供的MultipartFile.transferTo(File dest)方法实现文件的上传
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, originalFilename));
} catch (IOException e) {
logBefore(logger, "文件[" + originalFilename + "]上传失败,堆栈轨迹如下");
e.printStackTrace();
message.response = ResponseStatus.FAILED.getStatus();
message.message = "出错,服务器繁忙,请稍后再试。";
} }
//System.out.println(request.getContextPath() + "/upload/" + originalFilename);
message.response = ResponseStatus.SUCCESS.getStatus();
message.message = "上传成功!"; return message;
} /**
* 单条记录删除
*
* @return JSON
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "/delete")
public Message delete() {
logBefore(logger, "删除文件");
PageData pd = new PageData();
Message message = new Message();
String file_id = (String) pd.get("file_id");
// 获取对应文件名和地址
String filePath = "";
//TODO:删除本地文件,删除数据库记录
try {
pd = this.getPageData();
AccidentService.delete(pd);
message.response = ResponseStatus.SUCCESS.getStatus();
message.message = "删除成功";
} catch (Exception e) {
logger.error(e.toString(), e);
message.response = ResponseStatus.FAILED.getStatus();
message.message = "出错,服务器繁忙,请稍后再试。";
}
return message;
} /**
* 获取数据列表页
*
* @param page
* 页面请求对象
* @return 跳转页面
*/
@RequestMapping(value = "/list")
public ModelAndView list(HttpServletRequest request, Page page) {
logBefore(logger, "列表File");
// if(!Jurisdiction.buttonJurisdiction(menuUrl, "cha")){return null;}
// //校验权限
ModelAndView mv = this.getModelAndView();
PageData pd = new PageData();
//文件储存地址
//String realPath = request.getSession().getServletContext() .getRealPath("/upload/file");
//TODO:获取数据库文件信息
try {
pd = this.getPageData();
mv.setViewName("security/files/file_list");
mv.addObject(Const.SESSION_QX, this.getHC()); // 按钮权限
} catch (Exception e) {
logger.error(e.toString(), e);
}
return mv;
} /**
* 下载文件
*
* @param page
* 页面请求对象
* @return 跳转页面
* @throws IOException
*/
@RequestMapping(value = "/download")
public ResponseEntity<byte[]> download(HttpServletRequest request,
HttpServletResponse response, Page page) throws IOException {
logBefore(logger, "下载File");
PageData pd = new PageData();
String file_id = (String) pd.get("file_id");
// 获取对应文件名和地址
String fileName = "1.1.1关于印发《交运集团2016年安全生产工作意见》的通知.doc";
// fileName = "222";
String filePath = request.getServletContext().getRealPath(
"/upload/file")
+ "\\1.doc";
logBefore(logger, "fileName: " + fileName);
logBefore(logger, "filePath: " + filePath);
File file = new File(filePath);
try {
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");// 为了解决中文名称乱码问题
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} // 下载文件
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); try {
return new ResponseEntity<byte[]>(
FileUtils.readFileToByteArray(file), headers,
HttpStatus.CREATED);
} catch (IOException e) {
e.printStackTrace();
return null;
}
} }

其中一个FileUpload类的代码

package com.jiaoyun.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver; /**
* 上传文件 创建人:James 创建时间:2014年12月23日
*
* @version
*/
public class FileUpload { /**
* @param file
* //文件对象
* @param filePath
* //上传路径
* @param fileName
* //文件名
* @return 文件名
*/
public static String fileUp(MultipartFile file, String filePath, String fileName) {
String extName = ""; // 扩展名格式:
try {
if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
}
copyFile(file.getInputStream(), filePath, fileName + extName).replaceAll("-", "");
} catch (IOException e) {
System.out.println(e);
}
return fileName + extName;
} /**
* 写文件到当前目录的upload目录中
*
* @param in
* @param fileName
* @throws IOException
*/
private static String copyFile(InputStream in, String dir, String realName) throws IOException {
File file = new File(dir, realName);
if (!file.exists()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
System.out.println(file.getAbsolutePath());
FileUtils.copyInputStreamToFile(in, file);
return realName;
} /**
* @param request
* //requst请求
* @param filePath
* //上传路径
* @param fileName
* //文件名
* @return 文件名
* @throws IOException
* @throws IllegalStateException
*/
public static String upload(HttpServletRequest request, String filePath, String fileName)
throws IllegalStateException, IOException {
String extName = ""; // 扩展名格式:
String path = "";
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
// 取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (myFileName.trim() != "") {
// 重命名上传后的文件名
if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
}
// 定义上传路径
path = filePath + "/" + fileName + extName;
// System.out.println("---------------------");
// System.out.println(path);
// System.out.println("---------------------");
File localFile = new File(path);
file.transferTo(localFile);
}
}
} }
return extName;
} /**
* @param request
* //requst请求
* @param filePath
* //上传路径
* @param fileName
* //文件名
* @return 文件名
* @throws IOException
* @throws IllegalStateException
*/
public static String[] uploadMultiple(HttpServletRequest request, String filePath, String[] fileName)
throws IllegalStateException, IOException {
String[] extName = new String[fileName.length]; // 扩展名格式:
String path = "";
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
int i = 0;
while (iter.hasNext()) {
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
// 取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (myFileName.trim() != "") {
// 重命名上传后的文件名
if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
extName[i] = file.getOriginalFilename()
.substring(file.getOriginalFilename().lastIndexOf("."));
}
// 定义上传路径
fileName[i] = fileName[i].replace(extName[i], "");
path = filePath + "/" + fileName[i] + extName[i];
// path = fileName[i] + extName[i];
File localFile = new File(path);
file.transferTo(localFile);
System.out.println(localFile.getAbsolutePath());
}
}
i++;
} }
return extName;
} /**
* 从request那里得到所有MultipartFile
*/
public static List<MultipartFile> getMultipartFileFromRequest(HttpServletRequest request)
throws IllegalStateException, IOException { List<MultipartFile> fileList = new ArrayList<MultipartFile>();
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
MultipartFile file = multiRequest.getFile(iter.next());
System.out.println(file.getName()+"11111111111");
if (file != null && file.getSize() > 0) {
fileList.add(file);
}
}
}
return fileList;
}
/**
* @Description:删除文件
*/
public static void deleteFile(String bucketName, String key) {
return;
}
public static void deleteFile(String bucketName) {
return;
} /**
* 从request那里得到所有MultipartFile
*/
public static MultipartFile getMultipartFileByName(HttpServletRequest request,String name)
throws Exception {
MultipartFile file=null;
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
file = multiRequest.getFile(iter.next());
if (file != null&&file.getName().equals(name)) {
return file;
}
}
}
return file;
} /**
* 根据文件得到后缀名
* @param file
* @return
*/
public static String getExtNameByString(String file){
String extName="";
if (file.lastIndexOf(".") >= 0){
extName = file.substring(file.lastIndexOf("."));
}
return extName;
} public static String getExtName(MultipartFile file){
String extName="";
if (file.getOriginalFilename().lastIndexOf(".") >= 0){
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
}
return extName;
} }

html前台页面代码

上传按钮

<a class="btn red btn-circle btn-sm"
href="javascript:importData('file/upload');"> 上传文件 <i
class="fa fa-upload"></i>
</a>
<script>
function importData(url) {
dialog = bootbox.confirm({
title : '请选择文件',
message : '<form id="uploadFileForm" class="form-horizontal"><input type="file" name="file" value="选择文件" id="uploadFileInput" class="btn sbold green"/></form>',
buttons: {
confirm: {
label: '上传',
className: 'btn-success'
},
cancel: {
label: '取消',
className: 'btn-danger'
}
},
callback: function (result) {
if(result){
var formData = new FormData($( "#uploadFileForm" )[0]);
$.ajax({
type: "POST",
url: url,
data: formData,
dataType:'json',
async: false,
cache: false,
contentType: false, //必须false才会自动加上正确的Content-Type
processData: false, //必须false才会避开jQuery对 formdata 的默认处理
error: function(request) {
bootbox.alert("网络异常");
},
success: function(data){
   if (data.response == 'true') {
   bootbox.alert("上传成功!");
$table.bootstrapTable('refresh');
dialog.modal('hide');
    } else {
     bootbox.alert(data.message);
    }
}
});
}
}
});
}
</script>

下载按钮

<a class="btn default" id="demo_1"
href="file/download?file_id=1" target="_blank"> 下载文件 <i
class="fa fa-download"></i>
</a>

删除按钮

<a class="btn red" id="demo_1" href="file/delete?file_id=1"> 删除文件 <i class="fa fa-remove"></i>
</a>

SpringMVC ajax技术无刷新文件上传下载删除示例的更多相关文章

  1. 【JS】ajax 实现无刷新文件上传

    一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 <form target="hiddenF ...

  2. 基于jQuery Ajax实现无刷新文件上传

    最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadF ...

  3. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

  4. Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

    相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...

  5. 使用PHP和HTML5 FormData实现无刷新文件上传教程

    无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单 ...

  6. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传

    文件上传在Web程序开发中必不可少,ExtJS Form中有一个filefield字段,用来选择文件并上传.今天我们来演示一下如何通过filefield实现ExtJS Form无刷新的文件上传. 首先 ...

  7. ie8实现无刷新文件上传

    ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuer ...

  8. SpringMVC(三) RESTful架构和文件上传下载

    RESTful架构 REST全名为:Representational State Transfer.资源表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便,所 ...

  9. SpringMVC整合fastdfs-client-java实现web文件上传下载

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...

随机推荐

  1. python生成器、迭代器、__call__、闭包简单说明

    1.生成器 这种一边循环一边计算的机制,称为生成器:generator,最简单的方法是把生成式的[]改为(). >>> l=(x * x for x in range(1, 11) ...

  2. mybatis ----SqlSessionManager

    今天我们来看看这个类 有些写法还是很经典的 public class SqlSessionManager implements SqlSessionFactory, SqlSession { priv ...

  3. chrome mac 快捷键

    ⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Google Chrome 浏览器中打开计算机中的文件. 按住 ⌘ 键,然后 ...

  4. Ubuntu 16.04下使用Wine安装文件比对工具Beyond Compare 4

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...

  5. jquery操作checkbox方法(全选、全不选、至少选择一个、选择值/文本)

    原文:http://blog.csdn.net/u014079773/article/details/52371382 在实际开发中我们经常操作checkbox,不仅仅要获得checkbox选中的值, ...

  6. CentOS 笔记

    对安装CentOS安装使用过程中的问题做一个笔记,第一次安装,安装的是7.0版本,最小化安装. 安装环境 :Windows 2012 R2 Standard,Hyper-V Virstual Mach ...

  7. Intent 传递对象

    方法: 可以让这个要传递的对象所属类实现Serializable或者Parcelable接口, 然后利用onCreate函数中的Bundle参数作为载体,传递这个对象. 例如: <span st ...

  8. cocos2d-x step by step(3) Doub le Kill简单的一些小动画

    在触控厮混了两年多,不过达到了自己的初衷以及目的. 目前从事cocos2d的更改和调优移植工作. 1 简单的一个图片放大和缩小 auto sprite = Sprite::create("l ...

  9. Spring 与 MyBatis 整合

    一.实验介绍 1.1 实验内容 本节课程将整合 Spring 和 MyBatis,并采用 Junit 进行单元测试. 1.2 实验知识点 Spring - MyBatis 整合 Junit 单元测试 ...

  10. npm 安装包无法继续下载? 卡住

    一般是由于package.json配置的项目名不对