最近开始了一个新的项目,在这个项目中有很多对文件的操作,其实文件的上传已经不是什么新鲜的事儿了。作为一名开发者我自己也不是第一次处理文件方面的操作了,但是总是感觉自己对这些操作还不够熟练,仿佛有一层神秘的面纱没有被揭开,所以希望今天能将这个问题来总结一下,以便在日后的工作中能够拈手就来。
一、首先我们先来分析一下文件的上传过程
一个本地的文件上传到服务器中的过程:
首先我们要有一个界面可以让我们操作我们本地的文件
然后这个界面需要将我们选择的文件信息传递给一个逻辑处理中心(也就是我们的后台接口服务)
后台的接口服务程序接收到文件后需要对文件进行处理(比如我们要判断这个文件的类型、文件的大小、文件名称等一些信息)
处理完成之后我们需要选择文件的持久化方式,是需要存入数据库里面还是存入文件服务器的文件夹中,这一步是根据自己的实际需求决定
将文件存入服务器文件夹或者数据库中,操作就完成了
简单地做了个流程图:
二、文件上传的具体实现
1.前提条件
首先我们需要一个页面可以选择上传的文件,然后我们需要一个可以接收到文件对象的接口,最后我们还需要一个存放文件的服务器。在这篇文章里面作者采用的技术:页面——jsp和html;接口——SSM框架技术;数据库——mysql 5.7.20。
因为这次我们是分析对文件的操作,所以不细讲上面这些技术的使用。
2.设计逻辑思路
我采用的逻辑是:数据库——>接口——>页面——>测试
从底层数据库的表开始设计,然后处理接口和配置,再然后编写页面,最后千万不能忘了测试一把。
3.数据库设计
数据库的设计其实比较简单,直接在数据库中新建一张表就行了。
下面我贴一下sql代码:
CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`up_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`up_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`up_time` datetime(0) NOT NULL,
`up_content` blob NULL,
`up_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
)
这段代码我自己测试过,没问题!
4.接口服务
数据库表建好之后我们可以建一个与表相关的实体对象类
import java.util.Date;
/**
* Created by Viking on 2019/3/3
*/
public class FileUpload {
public Integer id;
public String upName;
public String upType;
public Date upTime;
public byte[] upContent;
public String upDesc;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUpName() {
return upName;
}
public void setUpName(String upName) {
this.upName = upName;
}
public String getUpType() {
return upType;
}
public void setUpType(String upType) {
this.upType = upType;
}
public Date getUpTime() {
return upTime;
}
public void setUpTime(Date upTime) {
this.upTime = upTime;
}
public byte[] getUpContent() {
return upContent;
}
public void setUpContent(byte[] upContent) {
this.upContent = upContent;
}
public String getUpDesc() {
return upDesc;
}
public void setUpDesc(String upDesc) {
this.upDesc = upDesc;
}
}
在SSM项目中上传文件还要先配置一下spring-mvc.xml
也贴一下配置的代码:
<!--配置视图解析器,访问WEB-INF下面的资源文件-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--在jsp文件中需要导入外部js库(jquery等)-->
<mvc:resources location="/lib" mapping="/lib/**"/>
<!--servlet默认处理器,在web.xml文件中映射地址为*.js-->
<mvc:default-servlet-handler/>
<!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960"/>
</bean>
如果要访问静态资源,那么还需要在web.xml文件中添加以下配置:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.jpg</url-pattern