**自己对于SSM文件上传的一些心得**
刚开始的时候也是在网上寻找一些简单的案例,可能我的这篇文章不是最好的,但是这些都是我自己慢慢的摸索以及自己的尝试的一些心得,希望对各位有所帮助。
其实文件的上传也不是特别的难,可能针对初学者来说是有一些难以理解,但是只要自己认真的分析一些,其实逻辑并不是特别的难。
首先做这个案例需要准备两个jar,我用的是maven,具体依赖如下:

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>

上面两个jar的依赖便是准备工作了,接下来便是上传的页面了,相信这个不会难倒小伙伴们,在此就直接把代码给大家,不做过多的解释了。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传下载</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/file/load"
method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file" width="120px"> <input
type="submit" value="上传">
</form>
</body>
</html>

  

多说一句<%@ page isELIgnored="false" %>这行代码的作用便是让浏览器解析jstl的代码,有些小伙伴们编写了jsp代码运行的时候如果从session中取数据有可能就是不会解析,从而取不到自己想要的数据。
下面便是运行界面的效果图

前面一些相信对于大家来说就是洒洒水了,关键的便是在控制层编写相应的逻辑代码了。

首先我们便是要得到文件的名称

//获取文件名称
String fileName = file.getOriginalFilename();

获得了文件的名称之后,如果你需要给文件一个新的名称可以使用UUID时间戳的方式给它一个新的名称,案例中没有使用,如果感兴趣的话,我也把代码给大家。

// 新文件名
String newFileName = UUID.randomUUID() + fileName;

得到了文件名称后,便是需要解决上传文件路径的问题了,最简单的便是自己设置一个绝对路径,我在本案例中便是使用的绝对路径具体代码如下:

//设置上传路径
String path = "D:/test1/";

若是想要放在项目路径下的话只需要修改自己相应的代码即可:

// 获得项目的路径
ServletContext sc = request.getSession().getServletContext();
// 上传位置
String path = sc.getRealPath("/files") + "/"; // 设定文件保存的目录

注意:在你路径下必须是“/”结尾,若是没有这个"/"到时候效果可能不会如你所想,想要实验的小伙伴们可以去试一试,在这里我便不演示了。

接下来的便是文件上传的核心了:文件上传主要是利用了流的思想。流便是:输入流和输出流(不要怪我啰嗦,主要是让一些不太清楚的小伙伴们理解,大神忽略即可)。

首先是判断下自己所设置的路径是否存在,如果没有判断的话,要是路径不存在,那么你的后台便会报错,具体的错误那就靠各位小伙伴们自己去尝试了,我就不在这里演示了,你只有自己尝试才会更加的注意这个问题,等下次报了相同的异常的时候自己就知道如何去解决。具体代码如下:

//文件上传
File f = new File(path); //判断路径是否存在,不存在则创建
if(!f.exists()){
f.mkdirs();
}

f.exists是一个判断这个路径是否存在的,返回的结果是一个Boolean值,如果存在返回true不存在则但会false,!便是对其取反,(就是原来是true的变成false,false变成true);f.mkdirs();便是创建对应文件。如果文件位置不存在的话,f.exists便是false ,然后对其取反便为true便会执行if里面的语句,从而创建对应的文件路径。

接下来便是处理文件上传了。

//判断上传文件是否为空
if(!file.isEmpty()){
try {
FileOutputStream fos = new FileOutputStream(path + fileName);
InputStream in = file.getInputStream();
int a = 0;
if((a = in.read())!=-1){
fos.write(a);
}
in.close();
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}

首先便是判断下用户上传的文件是否为空(就是用户是否上传了文件),若是你文件都没有选择便点击上传的话我们后台也没有必要去处理他了吧。
用户上传文件之后

这行代码就是开启一个输出流,输出的路径便是之前我们设置的路径,注意的是这里需要处理一下异常,我这里是直接捕获一个最大的异常。

FileOutputStream fos = new FileOutputStream(path + fileName);

这个便是得到上传文件的输入流

InputStream in = file.getInputStream();

下面的代码是通过一个变量a来接收输入流,一边读,然后输出流一边的写出去,当读完之后变量a的值便为-1,所以这便成了一个判断的依据,当变量a为-1的时候也就代表已经读完了,而且同时也写完了

int a = 0;
if((a = in.read())!=-1){
fos.write(a);
}

当读完之后小伙伴们记得把输入流和输出流关闭哦,如果不关闭的话会造成资源浪费的,而且还需注意的是大家要按照先开后关的原则哦。

in.close();
fos.close();

接下来的便是完整的代码。

@Controller
@RequestMapping("/file")
public class File2Controller { @PostMapping("/load")
public String fileload(MultipartFile file, HttpServletRequest request) { //获取文件名称
String fileName = file.getOriginalFilename(); //设置上传路径
String path = "D:/test1/"; //文件上传
File f = new File(path); //判断路径是否存在,不存在则创建
if(!f.exists()){
f.mkdirs();
}
//判断上传文件是否为空
if(!file.isEmpty()){
try {
FileOutputStream fos = new FileOutputStream(path + fileName);
InputStream in = file.getInputStream();
int a = 0;
if((a = in.read())!=-1){
fos.write(a);
}
in.close();
fos.close();
}catch (Exception e){
e.printStackTrace();
}
} return null;
}
}

效果图如下:

以上便是个人对于文件上传的一些心得,可能写的不是特别的好,只是希望对小伙伴们有一些帮助,特别是对于一些萌新们,只希望能够帮助你们就好。(最后希望大神们勿喷)

SSM文件上传的更多相关文章

  1. ssm文件上传下载比较详细的案例

    背景:ssm框架 接下来,我会介绍单文件上传,下载,多文件的上传,下载,使用ajax进行文件的上传下载,和普通的表单提交的文件上传下载. 只要做项目,总是少不了文件的操作,好了废话不多说,直接上代码! ...

  2. SSM文件上传要点总结

    文件的上传要点: 1.表单方面:enctype="multitype/form-data" 编码方式选择混编码 input 类型采用file 2.实体类一定要进行序列化,也就是im ...

  3. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...

  4. 回忆曾经的SSM框架实现文件上传

    近期在使用springboot实现文件上传的功能,想到曾经用SSM做过这个功能,在这里记录一下过去实现的方式 maven添加文件上传所需的依赖 springMVC的配置文件配置一下文件上传 我实现的是 ...

  5. SSM + Android 网络文件上传下载

    SSM + Android 网络交互的那些事 2016年12月14日 17:58:36 ssm做为后台与android交互,相信只要是了解过的人都知道一些基本的数据交互,向json,对象,map的交互 ...

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

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

  7. 【转】jsp+servlet和SSM分别是如何实现文件上传(示例)

    原文地址:https://blog.csdn.net/niceliusir/article/details/78453560 以下是jsp+servlet和SSM分别是如何实现文件上传的方法示例 两种 ...

  8. SSH,SSM框架文件上传

    一.了解文件上传 1.1        什么是文件上传 将本地文件通过流的形式写到服务器上 1.2        文件上传的技术 JspSmartUpload: 其组件是应用jsp进行B/S程序开发过 ...

  9. ssm框架下实现文件上传

      1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: <properties> <commons-fileupload.v ...

随机推荐

  1. js string 字符串

    mutil lines string 多行字符串, 由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用...表示,是单撇号, 不是单引号. 这是一个 多行 字符 ...

  2. linux安装json

    安装Json库 1.下载JsonCpphttp://sourceforge.net/projects/jsoncpp/files/ 2.下载sconshttp://sourceforge.net/pr ...

  3. tmux配置与用法整理

    tmux常用命令与快捷键 http://www.111cn.net/sys/linux/59058.htm http://www.360doc.com/content/13/0709/13/13047 ...

  4. ubuntu系统下安装pyspider:安装命令集合。

    本篇内容的前提是你已安装好python 3.5.在ubuntu系统中安装pyspider最大的困难是要依赖组件经常出错,特别是pycurl,但把对应的依赖组件安装好,简单了.下面直接上代码,所有的依赖 ...

  5. 负值之美:负margin在页面布局中的应用

    本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...

  6. 处理No CPU/ABI system image for target的方法

    处理No CPU/ABI system image for target的方法 最近菩提搭建完成Android开发环境后,在创建安卓模拟器的时候遇到了问题.这个问题就是图片中显示的no CPU/ABI ...

  7. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

  8. C语言之预处理命令与用typedef命名已有类型

    预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...

  9. IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写

    IntellJ是一款强大的编译器,那么它有很多实用的功能 一.鼠标点击减少效率,快捷键实现各种跳转 (1)项目之间的跳转 快捷键位置: 操作:首先要有两个项目,然后,在不同窗口打开:如图: 然后使用快 ...

  10. HDU 2393 Higher Math (判断直角三角形)

    题意:给定三个边,判断是不是直角三角形. 析:水题,勾股定理... 代码如下: #include <iostream> #include <cstdio> #include & ...