1..文件上传

在springmvc.xml中配置文件上传解析器

<!-- 上传图片配置实现类,id必须为这个 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传图片的大小 B 5M 1*1024*1024*5-->
<property name="maxUploadSize" value="5000000"/>
</bean>

2. jsp页面修改(类似于struts2)

aaarticlea/png;base64,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" alt="" />

3.上传处理(也可以用普通servlet的io流的方式直接处理,多文件上传类似于struts2,数组方式)

方法一:

@RequestMapping("updateItem")
public String updateItemById(Item item, MultipartFile pictureFile) throws Exception {
// 图片上传
// 设置图片名称,不能重复,可以使用uuid
String picName = UUID.randomUUID().toString(); // 获取文件名
String oriName = pictureFile.getOriginalFilename();
// 获取图片后缀
String extName = oriName.substring(oriName.lastIndexOf(".")); // 开始上传
pictureFile.transferTo(new File("C:/upload/image/" + picName + extName)); // 设置图片名到商品中
item.setPic(picName + extName);
// ---------------------------------------------
// 更新商品
this.itemService.updateItemById(item); return "forward:/itemEdit.action";
}

方法二:

// public ModelAndView updateItemById(Items items){
@RequestMapping(value = "/updateitem.action")
public String updateItem(QueryVo vo, MultipartFile pictureFile) throws Exception {
// 产生32位随机数并去掉-
String name = UUID.randomUUID().toString().replaceAll("-", "");
// jpg 获取文件拓展名
String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
// 保存文件,用UUID产生的唯一名字保存
pictureFile.transferTo(new File("F:\\upload\\" + name + "." + ext));
vo.getItems().setPic(name + "." + ext);
// 修改
vo.getItems().setCreatetime(new Date());
itemService.updateItemsById(vo.getItems()); // ModelAndView mav = new ModelAndView();
// mav.setViewName("success");
return "redirect:/itemEdit.action?id=" + vo.getItems().getId();
}

----------------------------------------------------------------------------------------文件下载处理(引用另一篇博客的)--------------------------------------------------------------------------------------

@RequestMapping("file")
@Controller
public class FileController {
/**
* 文件上传功能
* @param file
* @return
* @throws IOException
*/
@RequestMapping(value="/upload",method=RequestMethod.POST)
@ResponseBody
public String upload(MultipartFile file,HttpServletRequest request) throws IOException{
String path = request.getSession().getServletContext().getRealPath("upload");
String fileName = file.getOriginalFilename();
File dir = new File(path,fileName);
if(!dir.exists()){
dir.mkdirs();
}
//MultipartFile自带的解析方法
file.transferTo(dir);
return "ok!";
} /**
* 文件下载功能
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/down")
public void down(HttpServletRequest request,HttpServletResponse response) throws Exception{
//模拟文件,myfile.txt为需要下载的文件
String fileName = request.getSession().getServletContext().getRealPath("upload")+"/myfile.txt";
//获取输入流
InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));
//假如以中文名下载的话
String filename = "下载文件.txt";
//转码,免得文件名中文乱码
filename = URLEncoder.encode(filename,"UTF-8");
//设置文件下载头
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
int len = 0;
while((len = bis.read()) != -1){
out.write(len);
out.flush();
}
out.close();
}
}

例如:自己写的一个查询数据写入到excel中并提供下载的方法:

package cn.xm.jwxt.controller.trainScheme;

import cn.xm.jwxt.service.trainScheme.CourseBaseInfoService;
import cn.xm.jwxt.utils.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* @Author: qlq
* @Description 导出课程信息到Excel中
* @Date: 10:11 2018/4/29
*/
@Controller
public class ExtCourseExcel { @Autowired
private CourseBaseInfoService courseBaseInfoService;
private Logger logger = Logger.getLogger(ExtCourseExcel.class);
//1.先从缓存中取数据,看能取到取不到 //2.写入excel到本地 //3.打开流提供下载
//1.查询数据
public List<Map<String, Object>> getCourseBaseInfosByCondition(@RequestParam Map<String, Object> condition) {
List<Map<String, Object>> datas = null;
try {
datas = courseBaseInfoService.getCourseBaseInfosByCondition(condition);
} catch (SQLException e) {
logger.error("导出课程信息的时候查询数据库出错",e);
}
return datas;
} //2.写文件到excel中 /**
* 写数据到本地磁盘
* @param datas 课程数据
* @param fileQualifyName 文件全路径(比如C:/USER/XXX.excel)
*/
public void writeCourse2LocalExcel(List<Map<String,Object>> datas,String fileQualifyName){
String[] title = { "序号", "课程编号", "课程平台","课程性质","中文名称","英文名称","学分/学时", "周学时分配","计分方式" };
//2.1写入表头信息
// 创建一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个工作表sheet
HSSFSheet sheet = workbook.createSheet();
// 设置列宽
this.setColumnWidth(sheet, 9);
// 创建第一行
HSSFRow row = sheet.createRow(0);
// 创建一个单元格
HSSFCell cell = null;
// 创建表头
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
// 设置样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置字体居中
// 设置字体
HSSFFont font = workbook.createFont();
font.setFontName("宋体");
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 字体加粗
// font.setFontHeight((short)12);
font.setFontHeightInPoints((short) 13);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
cell.setCellValue(title[i]);
} // 2.2写入数据
// 从第二行开始追加数据
for (int i = 1, length_1 = (datas.size() + 1); i < length_1; i++) {
// 创建第i行
HSSFRow nextRow = sheet.createRow(i);
// 设置样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置字体居中
// 获取数据(一条数据)
Map<String, Object> course = datas.get(i - 1);
for (int j = 0; j < 9; j++) {
HSSFCell cell2 = nextRow.createCell(j);
cell2.setCellStyle(cellStyle);
if (j == 0) {
cell2.setCellValue(i);//第一列是序号
continue;
}
if (j == 1) {
cell2.setCellValue(course.get("courseNum").toString());//课程编号
continue;
}
if (j == 2) {
cell2.setCellValue(course.get("coursePlatform").toString());//课程平台
continue;
}
if (j == 3) {
cell2.setCellValue(course.get("courseNature").toString());//课程性质
continue;
}
if (j == 4) {
cell2.setCellValue(course.get("courseNameCN").toString());//中文名称
continue;
}
if (j == 5) {
cell2.setCellValue(course.get("courseNameEN").toString());//英文名称
continue;
}
if (j == 6) {
cell2.setCellValue(course.get("credit").toString()+"/"+course.get("courseHour").toString());//学分/学时
continue;
}
if (j == 7) {
cell2.setCellValue(course.get("weeklyHour").toString());//周学时
continue;
}
if (j == 8) {
cell2.setCellValue(course.get("scoringWay").toString());//计分方式
continue;
}
}
} // 创建一个文件
File file = new File(fileQualifyName);
// 获取文件的父文件夹并删除文件夹下面的文件
File parentFile = file.getParentFile();
// 获取父文件夹下面的所有文件
File[] listFiles = parentFile.listFiles();
if (parentFile != null && parentFile.isDirectory()) {
for (File fi : listFiles) {
// 删除文件
fi.delete();
}
}
// 如果存在就删除
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
// 打开文件流并写入文件
FileOutputStream outputStream = org.apache.commons.io.FileUtils.openOutputStream(file);
workbook.write(outputStream);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 设置列宽的函数
* @param sheet 对哪个sheet进行设置,
* @param colNum
*/
private void setColumnWidth(HSSFSheet sheet, int colNum) {
for (int i = 0; i < colNum; i++) {
int v = 0;
v = Math.round(Float.parseFloat("15.0") * 37F);
v = Math.round(Float.parseFloat("20.0") * 267.5F);
sheet.setColumnWidth(i, v);
}
} //3.打开流提供下载
@RequestMapping("/downCourses")
public void down(HttpServletRequest request, HttpServletResponse response,@RequestParam Map condition){
//1.查询数据
List<Map<String, Object>> datas = this.getCourseBaseInfosByCondition(condition);
//2.写入excel
String dir = ResourcesUtil.getValue("path","courseExcelFile");
String fileName = DefaultValue.COURSE_DEFAULT_FILENAME;
String fileQualifyName = dir + fileName;//生成的excel名字
this.writeCourse2LocalExcel(datas,fileQualifyName);//写入数据(生成文件)
//3.打开流提供下载
//获取输入流
try {
InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileQualifyName)));
fileName = URLEncoder.encode(fileName,"UTF-8");
//设置文件下载头
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
int len = 0;
while((len = bis.read()) != -1){
out.write(len);
out.flush();
}
out.close();
} catch (Exception e) {
logger.error("下载课程信息出错!",e);
}
}
}

springMVC文件上传与下载(六)的更多相关文章

  1. ExtJS+SpringMVC文件上传与下载

    说到文件上传.下载功能,网络上大多介绍的是采用JSP.SpringMVC或者Struts等开源框架的功能,通过配置达到文件上传.下载的目地.可是最近项目要用到文件上传与下载的功能,因为本项目框架采用开 ...

  2. SpringMVC文件上传和下载的实现

    SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...

  3. SpringMVC文件上传和下载

    上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...

  4. SpringMVC文件上传与下载

    一.关键步骤 ①引入核心JAR文件 SpringMVC实现文件上传,需要再添加两个jar包.一个是文件上传的jar包,一个是其所依赖的IO包.这两个jar包,均在Spring支持库的org.apach ...

  5. SpringMVC 文件上传及下载

    首先需要导入jar包 创建一个jsp页面 package cn.happy.Controller; import java.io.File; import javax.servlet.http.Htt ...

  6. Http服务器实现文件上传与下载(五)

    一.引言 欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Conte ...

  7. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  8. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  9. springmvc文件上传下载简单实现案例(ssm框架使用)

    springmvc文件上传下载实现起来非常简单,此springmvc上传下载案例适合已经搭建好的ssm框架(spring+springmvc+mybatis)使用,ssm框架项目的搭建我相信你们已经搭 ...

随机推荐

  1. 睡前小dp-hdu3853-概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3853 膜猴烧酒madoka 讲定义为dp[i][j] 位置为ij的魔法值期望,可以发现dp[i][j] = dp ...

  2. 【POJ 2251】Dungeon Master(bfs)

    BUPT2017 wintertraining(16) #5 B POJ - 2251 题意 3维的地图,求从S到E的最短路径长度 题解 bfs 代码 #include <cstdio> ...

  3. mycat实现简单的mysql集群负载均衡

    什么是mycat呢? 简单理解为一个MySQL中间件,它支持分流.基于心跳的自动故障切换,支持读写分离,支持mysql主从,基于Nio管理线程的高并发… 详见官网:http://www.mycat.i ...

  4. 自学Linux Shell12.2-test命令

    点击返回 自学Linux命令行与Shell脚本之路 12.2-test命令 if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径. 如果tes ...

  5. 【转】__int64 与long long 的区别

    //为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数 //结果VC中还是认为是32位的,显然不合适 //typedef signed long int    ...

  6. 2018 省选 D1T2 IIIDX

    题目大意: 给出k.n个数选择一种字典序最大的排列,使得对于任意的i,di>=d[i/k](下取整 下同) 分析: 很容易想到的是建树,将i的父亲设为[i/k],之后建有向边. 60分贪心: 将 ...

  7. asp(utf-8) set cookie 用 javascript 读cookie发现一个问题

    asp: <%setCookie("user_id","test")%>   //传一个cookie ,名: user_id 值:test java ...

  8. Django框架之模板继承和静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

  9. SpringBoot 核心配置

    1. 入口类和 @SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法 ...

  10. 简易ATM机

    简易ATM机(代码如下): /* * 功能:简易银行系统 */package day8; import java.util.Scanner; /** * * @FengYan Huang Admini ...