参考

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. 利用adb截屏

    一  第一种方式 二 第二种方式  

  2. HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...

  3. 邁向IT專家成功之路的三十則鐵律 鐵律二十五:IT人屈辱之道-十倍奉還

    現代人普遍火氣都很大,與人爭論時只要有一點點感到屈辱,便會開始大聲反擊,甚至於暴力相向.至於企業中的人事相鬥,則是典型的來個明爭暗鬥,直到成為老闆眼中的紅人,在逐漸掌握了權力之後再來個內部大清洗,不久 ...

  4. Leetcode 232 Implement Queue using Stacks 和 231 Power of Two

    1. 232 Implement Queue using Stacks 1.1 问题描写叙述 使用栈模拟实现队列.模拟实现例如以下操作: push(x). 将元素x放入队尾. pop(). 移除队首元 ...

  5. 配置mysql主从服务器

    参考:https://www.linuxidc.com/Linux/2016-09/135633.htm 一.Master主服务器配置(192.168.1.3) 1.编辑my.cnf(命令查找文件位置 ...

  6. maven的学习系列(二)—maven的文件夹结构

    maven的文件有自己的组织方式,例如以下所看到的: ---maven ----src ---main ----java ---test ----java -----pom.xml 当运行完mvn c ...

  7. 在pypy环境中运行odoo8

    PyPy是一个独立的解析器, 通过即时编译(JIT,Just-in-time)代码避免逐行解释执行来提升运行速度的(将编译过的行代码缓存起来,从而加快速度).我们一般使用的Python一般是使用C实现 ...

  8. bat+sqlcmd 批量执行脚本

    Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行. 不用忍受powershell invoke-sqlcmd 的笨重.在指执行时多一种选择. bat文 ...

  9. PCB中地线和电源线的布线规则

    电源. 地线的布置考虑不周到而引起干扰,使产品的性能下降,严重时会降低产品的成功率.要把电源线和地线处理好,将电源线和地线所产生的噪音干扰降到最低限度,以保证产品的质量.一.电源线和地线的布线规则1) ...

  10. 笔记04 WPF的Binding

    oneWay:使用 OneWay 绑定时,每当源发生变化,数据就会从源流向目标. OneTime: 绑定也会将数据从源发送到目标:但是,仅当启动了应用程序或 DataContext 发生更改时才会如此 ...