文件上传 - 前端页面上传 file 文件到服务器

我们还是基于上一篇文章进行编写 : https://blog.csdn.net/weixin_42629433/article/details/83378652

一. 数据库中创建表

-- 创建部门表
CREATE TABLE dept(
id INT(20) NOT NULL AUTO_INCREMENT,	
deptName VARCHAR(50),
createDate VARCHAR(50),
deptPic VARCHAR(100),
deptStatus VARCHAR(10),
PRIMARY KEY (id)		
)
 
INSERT INTO dept VALUES (NULL, '售后部', '2016-07-01', 'IMG_0834.JPG', '1');

 

二. 文件配置

1. 在父工程 pom.xml 中导入上传文件的依赖:

<!-- 上传文件需要用到的依赖 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

<!-- 上传文件到其他服务器需要用到的依赖 -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18.1</version>
</dependency>

2. 在 spring-mvc.xml 中配置如下内容, 管理上传文件的大小:

<!-- 文件上传 -->
<!-- 配置解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--配置最大文件大小-->
    <property name="maxUploadSize" value="10485760" />
</bean>

 

三. 代码编写

1. 编写数据库中要操作的表的实体封装类:

package com.cast.domain;

import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * 封装部门表的实体类
 */
public class Dept {

    private Integer id;             //部门 id
    private String deptName;        //部门名称
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date createDate;        //部门成立时间
    private String createDateStr;
    private String deptPic;         //部门 logo
    private Integer deptStatus;     //部门状态
    private String deptStatusStr;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getCreateDateStr() {
        if (createDate != null) {
            createDateStr = DateUtils.dateToString(createDate, "yyyy-MM-dd");
        }
        return createDateStr;
    }

    public void setCreateDateStr(String createDateStr) {
        this.createDateStr = createDateStr;
    }

    public String getDeptPic() {
        return deptPic;
    }

    public void setDeptPic(String deptPic) {
        this.deptPic = deptPic == null ? null : deptPic.trim();
    }

    public Integer getDeptStatus() {
        return deptStatus;
    }

    public void setDeptStatus(Integer deptStatus) {
        this.deptStatus = deptStatus;
    }

    public String getDeptStatusStr() {
        if(deptStatus != null) {
            if (deptStatus == 0) {
                deptStatusStr = "关闭";
            } else if (deptStatus == 1) {
                deptStatusStr = "开启";
            }
        }
        return deptStatusStr;
    }

    public void setDeptStatusStr(String deptStatusStr) {
        this.deptStatusStr = deptStatusStr;
    }

}

2. 在 dao 层编写接口操作数据库

package com.cast.dao;

import com.cast.domain.Dept;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 持久层 dao 接口
 */
public interface IDeptDao {

    //查询所有 Dept
    @Select("select * from dept")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "deptName", column = "deptName"),
            @Result(property = "createDateStr", column = "createDate"),
            @Result(property = "deptPic", column = "deptPic"),
            @Result(property = "deptStatus", column = "deptStatus")
    })
    public List<Dept> findAll() throws Exception;

    //添加 Dept
    @Insert("insert into dept values (null,#{deptName},#{createDateStr},#{deptPic},#{deptStatus})")
    public void addDept(Dept dept) throws Exception;

}

3. 在 service 层接口编写操作数据看的抽象方法:

package com.cast.service;

import com.cast.domain.Dept;

import java.util.List;

/**
 * 业务层 service 接口
 */
public interface IDeptService {

    //查询所有 Dept
    public List<Dept> findAll(Integer page, Integer size) throws Exception;

    //添加 Dept
    public void addDept(Dept dept) throws Exception;

}

4. 在 service 层编写接口的实现类来调用 dao 层:

package com.cast.service.impl;

import com.cast.dao.IDeptDao;
import com.cast.domain.Dept;
import com.cast.service.IDeptService;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 业务层 service 接口实现类
 */
@Service
@Transactional
public class DeptServiceImpl implements IDeptService {

    @Autowired
    private IDeptDao deptDao;

    public List<Dept> findAll(Integer page, Integer size) throws Exception {
        PageHelper.startPage(page, size);
        return deptDao.findAll();
    }

    public void addDept(Dept dept) throws Exception {
        deptDao.addDept(dept);
    }

}

5. 在 controller 层接收前端请求数据和相应结果给前端:

*** 接收带有上传文件的 form 表单中的参数时, 需要在方法括号内额外提取 HttpServletRequest request, MultipartFile pictureFile, 且 MultipartFile 类型的参数值应与前端上传项标签中name的值 pictureFile 保持一致:

前端上传项标签 : <input type="file" name="pictureFile" />

package com.cast.controller;

import com.cast.domain.Dept;
import com.cast.service.IDeptService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/dept")
public class DeptController {

    @Autowired
    private IDeptService deptService;

    @RequestMapping("/findAll.do")
    public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1")Integer page,
                                @RequestParam(name = "size", required = true, defaultValue = "5")Integer size) throws Exception {
        ModelAndView mv = new ModelAndView();
        List<Dept> deptList = deptService.findAll(page, size);
        PageInfo pageInfo = new PageInfo(deptList);
        mv.addObject("pageInfo", pageInfo);
        mv.setViewName("dept-list");
        return mv;
    }

    @RequestMapping(value = "/addDept.do", method = RequestMethod.POST)
    public String addDept(HttpServletRequest request, Dept dept, MultipartFile pictureFile) throws Exception {
        //获取文件上传的路径
        String path = request.getServletContext().getRealPath("/uploads");
        //创建文件
        File file = new File(path);
        //判断是否存在
        if (!file.exists()){
            file.mkdirs();
        }
        //获得要上传的文件名
        String filename = pictureFile.getOriginalFilename();
        //生成随机数
        String uuid = UUID.randomUUID().toString().replace( "-", "" );
        //把文件名称设置成唯一值
        filename = filename + "_" + uuid;
        //开始上传文件
        pictureFile.transferTo(new File(path,filename ));
        //把文件名存在javaBean中
        dept.setDeptPic(filename);
        //将 dept 的数据存入数据库中
        deptService.addDept(dept);
        return "redirect:findAll.do";
    }

}

 

四. 前端核心代码

请求页面核心代码

*** form 表单中有上传项目的, 需要在 form 标签中添加 enctype="multipart/form-data" 的属性及对应的属性值

*** 上传项 <input /> 标签中的 name 的属性值不应与封装类中的属性值一致

*** 上传项 <input /> 标签中的 name 的属性值与 controller 层获取前端请求参数时定义的 MultipartFile 类型的参数 pictureFile 保持一致

<%--添加表单--%>
<form action="${pageContext.request.contextPath}/dept/addDept.do" id="addForm" enctype="multipart/form-data" method="post">

    <!-- 正文区域 -->
    <section class="content">

        <%--部门信息--%>
        <div class="panel panel-default">
            <%--用户输入的部门信息表--%>
            <div class="row data-type">

                <div class="panel panel-default">
                    <div class="panel-heading">部门信息</div>
                    <div class="row data-type">

                        <div class="col-md-2 title">部门名称</div>
                        <div class="col-md-4 data">
						    <input type="text" class="form-control" name="deptName" id="deptName" placeholder="部门名称" value="">
					    </div>

					    <div class="col-md-2 title">成立时间</div>
					    <div class="col-md-4 data">
						    <div class="input-group date">
							    <div class="input-group-addon">
								    <i class="fa fa-calendar"></i>
							    </div>
							    <input type="text" class="form-control pull-right" id="datepicker-a3" name="createDate">
						    </div>
					    </div>

					    <div class="col-md-2 title">部门图片</div>
					    <div class="col-md-4 data">
						    <input type="file" name="pictureFile" />
					    </div>

					    <div class="col-md-2 title">部门状态</div>
					    <div class="col-md-4 data">
						    <select id="sex" class="form-control select2" style="width: 100%" name="deptStatus">
						        <option value="noSelect" selected="selected"><--请选择--></option>
						        <option value="0">关闭</option>
						        <option value="1">开启</option>
					        </select>
				        </div>

			        </div>
		        </div>

		        <%--保存 / 返回 按钮--%>
		        <div class="box-tools text-center">
			        <button type="submit" class="btn bg-maroon">保存</button>
			        <button type="button" class="btn bg-default" onclick="history.back(-1);">返回</button>
		        </div>

	        </div>

        </div>

    </section>

</form>

 

代码下载: https://pan.baidu.com/s/1wkwlwThb2YXo0rjWq9AFHg

***此代码需在 jdk1.8 下运行使用***

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值