基于SpringMVC的上传文件实现

1.项目源码

源码地址:upload

2.关键代码

    @RequestMapping("/upload2")
public void datalist2(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
req.setCharacterEncoding("utf-8");
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = req.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//上传时生成的临时文件保存目录
String tempPath = req.getSession().getServletContext().getRealPath("/WEB-INF/temp");
File file = new File(tempPath);
if(!file.exists()&&!file.isDirectory()){
System.out.println("目录或文件不存在!");
file.mkdir();
}
//消息提示
String message = "";
try {
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
diskFileItemFactory.setSizeThreshold(*);
//设置上传时生成的临时文件的保存目录
diskFileItemFactory.setRepository(file);
//2、创建一个文件上传解析器
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
//解决上传文件名的中文乱码
fileUpload.setHeaderEncoding("UTF-8");
//监听文件上传进度
fileUpload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
}
});
//3、判断提交上来的数据是否是上传表单的数据
if(!fileUpload.isMultipartContent(req)){
//按照传统方式获取数据
return;
}
//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
fileUpload.setFileSizeMax(*);
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
fileUpload.setSizeMax(**);
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = fileUpload.parseRequest(req);
for (FileItem item : list) {
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
String name = item.getFieldName();
//解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
String value1 = new String(name.getBytes("iso8859-1"),"UTF-8");
System.out.println(name+" "+value);
System.out.println(name+" "+value1);
}else{
//如果fileitem中封装的是上传文件,得到上传的文件名称,
String fileName = item.getName();
System.out.println(fileName);
if(fileName==null||fileName.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
fileName = fileName.substring(fileName.lastIndexOf(File.separator)+);
//得到上传文件的扩展名
String fileExtName = fileName.substring(fileName.lastIndexOf(".")+);
if("zip".equals(fileExtName)||"rar".equals(fileExtName)||"tar".equals(fileExtName)||"jar".equals(fileExtName)){
// req.setAttribute("message", "上传文件的类型不符合!!!");
// req.getRequestDispatcher("/message.jsp").forward(req, res);
res.getWriter().write("上传文件的类型不符合!!!");
return;
}
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传文件的扩展名为:"+fileExtName);
//获取item中的上传文件的输入流
InputStream is = item.getInputStream();
//得到文件保存的名称
fileName = mkFileName(fileName);
System.out.println("文件名称为:"+fileName);
//得到文件保存的路径
String savePathStr = mkFilePath(savePath, fileName);
System.out.println("保存路径为:"+savePathStr);
System.out.println("数据库应保存的是:"+savePathStr+"/"+fileName);
//创建一个文件输出流
FileOutputStream fos = new FileOutputStream(savePathStr+File.separator+fileName);
//创建一个缓冲区
byte buffer[] = new byte[];
//判断输入流中的数据是否已经读完的标识
int length = ;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((length = is.read(buffer))>){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
fos.write(buffer, , length);
}
//关闭输入流
is.close();
//关闭输出流
fos.close();
//删除处理文件上传时生成的临时文件
item.delete();
res.setContentType("text/html;charset=UTF-8");
res.getWriter().write("文件上传成功");
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
// req.setAttribute("message", "单个文件超出最大值!!!");
// req.getRequestDispatcher("/message.jsp").forward(req, res);
res.setContentType("text/html;charset=UTF-8");
res.getWriter().write("单个文件超出最大值!!!");
return;
}catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
// req.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
// req.getRequestDispatcher("/message.jsp").forward(req, res);
res.setContentType("text/html;charset=UTF-8");
res.getWriter().write("上传文件的总的大小超出限制的最大值!!!");
return;
}catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
res.setContentType("text/html;charset=UTF-8");
message = "文件上传失败";
}
// req.setAttribute("message",message);
// req.getRequestDispatcher("/message.jsp").forward(req, res);
res.setContentType("text/html;charset=UTF-8");
res.getWriter().write("成功");
} public String mkFileName(String fileName){
return UUID.randomUUID().toString()+"_"+fileName;
}
public String mkFilePath(String savePath,String fileName){
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
int hashcode = fileName.hashCode();
int dir1 = hashcode&0xf;
int dir2 = (hashcode&0xf0)>>;
//构造新的保存目录
String dir = savePath + "\\" + dir1 + "\\" + dir2;
//File既可以代表文件也可以代表目录
File file = new File(dir);
if(!file.exists()){
file.mkdirs();
}
return dir;
}

 

3.测试

在自己的测试中,输入正确的地址,注意:路径地址是由SpringMVC转发的。
在项目中还存在其他上传文件的方法,就不在一一列举。

只为成功找方法,不为失败找理由。大胆的尝试,下一个fun就是你的fun!

基于SpringMVC的上传文件实现的更多相关文章

  1. 【SpringMVC】使用SpringMVC进行上传文件!

    写在前面: 之前在上传文件的时候,使用的是commons-file-upload这个插件,非常方便,能控制每个文件的大小,总共大小,缓存,以及支持多个文件的同时上传,但是写一次上传文件的后台代码量太大 ...

  2. SpringMVC 之 上传文件

    一.需求: 利用SpringMVC实现上传文件的功能 二.思路: 1.我们可以在SpringMVC中,通过配置一个MultipartResolver来上传文件. 2.通过MultipartFile f ...

  3. springmvc+ajaxFileUpload上传文件(前后台彻底分离的情况下)

    首先是导入jar包: web.xml: <servlet> <servlet-name>mvc-dispatcher</servlet-name> <serv ...

  4. SpringMVC 学习-上传文件分解器 CommonsMultipartResolver 类

    Spring 组件 CommonsMultipartResolver 类的主要作用是配置文件上传的一些属性,也可以控制上传文件的大小. 在 springmvc-servlet.xml 配置文件中: & ...

  5. 基于socket实现上传文件

    基于socket实现文件上传 客户端代码: #!/usr/bin/env python # -*- coding:utf-8 -*- """ 这个是实现上传文件 首先让客 ...

  6. SpringMVC在上传文件的时候提示The current request is not a multipart request错误

    @RequestMapping("/insertOrder") @ResponseBody public  Object insertOrder(String userId,Htt ...

  7. SpringMvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  8. springmvc.xml 上传文件的配置

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.Comm ...

  9. Springmvc异步上传文件

    <script src="js/jquery.js" type="text/javascript"></script><scrip ...

随机推荐

  1. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  2. [转]全图形PPT设计指南

    三.什么时候使用 全图形PPT并不适用于所有时候,一般来说,我们在以下场合可以考虑使用:陈述一个故事.名人简介.产品介绍.读书笔记.心灵鸡汤.生活情趣等. 四.如何制作全图形PPT 全图形PPT的制作 ...

  3. 大中型 UGC 平台的反垃圾(anti-spam)工作

    本文来自网易云社区 随着互联网技术的日渐发展,相继诞生了垂直社区.社交平台.短视频应用.网络直播等越来越多样的产品.但在内容爆炸式增长的同时,海量UGC中也夹杂着各种违规垃圾信息,包括垃圾广告.诈骗信 ...

  4. fix34

    public int[] fix34(int[] nums) { int i3=0; int i4=0; int temp=0; while( (i3<nums.length)&& ...

  5. appium-在页面点击一下处理(一般处理提示蒙层)

    在写用例的时候,经常会发现某些第一次进去的页面会有一个蒙层提示.我们只有处理掉这个蒙层,才能继续我们的用例: 这边我们使用的是TouchAction的tap方法 TouchAction action ...

  6. 孤荷凌寒自学python第二十天python的匿名函数与偏函数

    孤荷凌寒自学python第二十天python的匿名函数与偏函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python为使函数的使用更加方便高效,可以使用两种特殊的函数简化语句书写. 一 ...

  7. 解决windows文件名过长无法删除的问题

    删除windows文件时,系统提示如下错误: 从网上找到下面的一种方法,顺利解决(原理不清楚),现记录删除方法如下: . 在要删除的文件夹(delete_dir)同级新建一个空文件夹(empty_di ...

  8. tinymce 上传图片空间(转)

    转载自:http://www.cnblogs.com/ilovewindy/p/3823069.html 创建plugin后, editor_plugin.js中使用了 imageUploadWind ...

  9. [ecmagent][redis学习][1初识redis] redis安装+redis快速教程+python操作redis

    # redis安装 # redis安装教程 -- 服务器(ubuntu)安装redis服务 sudo apt-get install redis-server -- 源码安装 -- $ wget ht ...

  10. Java 打印* 三角形

    package anli1; public class sanjiaoxing { public static void main(String[] agrs){ System.out.println ...