spring boot+ajax视频上传功能

功能介绍

废话不多说直接上图。
在这里插入图片描述

代码

这次主要讲的是ajax取文件数据给后端,然后后端要怎么做文件上传的处理。其他一些内容就不讲了,我的其他几篇spring boot文章有写可以去看。
从前端开始写到服务层,后面的就不写了,后面的具体看别的教程。

配置application以及全局异常类

先配置一下application,因为spring boot一开始默认文件上传最大为1MB,超出的话就会异常。顺便配置一下tomcat的大小,原因的话下面代码中的注释链接可以看一下。另外要说明一下,如果上传文件超出配置的话,会报MaxUploadSizeExceededException异常,该异常是在controller层之前报的,所以要写全局异常类来捕获。

#文件上传大小设置,springboot默认文件大小的限制是1MB,值可以使用后缀“MB”或“KB”.如果是想要不限制文件上传的大小,那么就把两个值都设置为-1
spring:
  servlet:
    multipart:
      #单个数据的大小
      max-file-size: 2048MB
      #总数据的大小
      max-request-size: 2048MB

server:
  tomcat:
    max-swallow-size: -1    # 最重要的是这一行  捕获文件大小超出异常注意:https://blog.csdn.net/ifu25/article/details/90173264

@RestControllerAdvice       //全局异常类
public class UploadingHandlerInterceptor {
    /* spring默认上传大小1MB 超出大小捕获异常MaxUploadSizeExceededException */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public RespEntity handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        Map<String,Object> map=new HashMap<>();
        map.put("msguploading","文件大小超过2GB,上传失败");
        String msguploading=(String)map.get("msguploading");
        return new RespEntity(RespCode.ERROR,msguploading);
    }
}

personal.html

这里的多选框是用select2插件,这个自行百度。

<div class="col-md-4 column" style="margin: 5%">
    <h3>
        上传视频
    </h3>
    <form role="form" enctype="multipart/form-data" id="uploadingvideo">
        <div class="form-group">
            <label for="videoname">视频名称
                <span class="help-inline" style="color: red">*</span>
                <span class="help-inline" style="color: red;font-size:12px">字数不超过30个</span>
            </label>
            <input type="text" class="form-control" id="videoname" maxlength="30" required/>
        </div>
        <div class="form-group">
            <label class="control-label">视频标签
                <span class="help-inline" style="color: red">*</span>
                <span class="help-inline" style="color: red;font-size:12px">标签数量不可超过5个</span>
            </label>
            <div class="">
                <select id="speakers" class="form-control speakers" multiple="multiple" required>
                        <option value="动漫">动漫</option>
                        <option value="教育">教育</option>
                        <option value="娱乐">娱乐</option>
                        <option value="影视">影视</option>
                        <option value="广告">广告</option>
                        <option value="搞笑">搞笑</option>
                        <option value="音乐">音乐</option>
                        <option value="生活">生活</option>
                        <option value="运动">运动</option>
                        <option value="科技">科技</option>
                        <option value="游戏">游戏</option>
                </select>     <!-- select2多选功能-->
            </div>
        </div>
        <div class="form-group">
            <label for="introduce">视频介绍
                <span class="help-inline" style="color: red">*</span>
                <span class="help-inline" style="color: red;font-size:12px">字数不超过500个</span>
            </label>
            <textarea name="introduce" class="form-control" id="introduce" maxlength="500" required></textarea>
        </div>
        <div class="form-group">
            <label>文件导入<span class="help-inline" style="color: red">*<a style="cursor:pointer;" title="文件大小不超过2GB;
                &#10;带有H.264视频编码和AAC音频编码的MPEG 4文件;
                &#10;带有VP8视频编码和Vorbis音频编码的WebM文件;
                &#10;带有Theora视频编码和Vorbis音频编码的Ogg文件。
                &#10;(如没按要求的格式,将由系统工作人员审核后进行格式转换,部分格式可能转换失败而无法发布)
            ">文件要求(鼠标悬停此处查看)</a></span></label>
            <input type="file" id="file" required/>
            <p class="help-block">
                选择你要上传的视频
            </p>
            <button type="submit" class="btn btn-default" style="background: #5cb85c;color: black;float: right">上传</button>
        </div>
    </form>
</div>

Personal.js

这里要注意的是ajax里面参数的写法,还有用FormData()获取表单数据。
参考:ajax实现文件上传(使用FormData)
SpringBoot文件上传示例-ajax和REST

//上传视频  https://www.cnblogs.com/han-guang-xue/p/9988157.html
$(document).ready(function() {
    $("#uploadingvideo").bind("submit",
        function(){
            var formdata = new FormData();      //FormData() 文件上传https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/FormData
            formdata.append('vname',$("#videoname").val());
            formdata.append('vtag',$("#speakers").val().toString());     //标签多选框为数组,要转换成字符后端才能接收到
            formdata.append('introduce',$("#introduce").val());
            formdata.append('file', $('#file')[0].files[0]);
            $.ajax({
                url:"/uploading",
                type:"POST",
                dataType:"JSON",
                // contentType默认的值为:'application/x-www-form-urlencoded; charset=UTF-8,
                // 而文件上传一个是multipart/form-data,但是请求内容不只是文件上传。所有使用contentType:false
                contentType:false,
                //processData参数默认的值为true,会转数据格式,上传不需要转,所有使用processData: false
                processData:false,
                data:formdata,
                success:function (data) {
                    if (data.code==0){
                        alert('上传成功');
                    }
                    if (data.code==-1){
                        alert(data.data);
                    }
                }
            })
        return false;
    });
});

PersonalController .java

@RestController
public class PersonalController {       //个人中心的控制层
    @Autowired
    private UserService userService;
    
    @PostMapping("/uploading")   //上传视频
    public RespEntity uploadingVideo(HttpServletRequest request,@RequestParam("file") MultipartFile file,
            @RequestParam(value = "vname") String vname, @RequestParam(value = "vtag") String vtag,
            @RequestParam(value = "introduce") String introduce)
    {
        Map<String,Object> map=new HashMap<>();
        boolean uploadingvideo=userService.uploadingVideo(request,vname,vtag,introduce,map,file);
        String msguploading=(String)map.get("msguploading");
        if (uploadingvideo==true){
            return new RespEntity(RespCode.SUCCESS);
        }else{
            return new RespEntity(RespCode.ERROR,msguploading);
        }
    }
}

UserServiceImpl.java和UserService.java

参考:SpringBoot上传文件实现
springboot2.0上传文件(视频,图片)到服务器硬盘,并保存路径至mysql,返回可直接访问的url

@Service
public class UserServiceImpl implements UserService {      //处理用户相关的服务
    @Autowired
    private VideoMapper videoMapper;

	@Override
    public boolean uploadingVideo(HttpServletRequest request, String vname,
                                  String vtag, String introduce, Map<String, Object> map, MultipartFile file)
    {
        //文件上传
        // 获取文件名,带后缀
        String originalFilename = file.getOriginalFilename();
        // 获取文件的后缀格式
        String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
        //(加个时间戳,尽量避免文件名称重复)保存的文件名为: "+vname.xxx+"\n,xxx指的是fileSuffix获得的后缀
        String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + vname+"."+fileSuffix;
        // 该方法返回的为当前项目的工作目录,即在哪个地方启动的java线程  当前为E:\graduation\videoweb
        String dirPath = System.getProperty("user.dir");
        //文件存储路径
        String path = dirPath+"/src/main/resources/static/video/videourl/false/" +fileName;
        //创建文件路径
        File dest = new File(path);
        //判断文件是否已经存在
        if (dest.exists())
        {
            map.put("msguploading","上传失败,文件已存在.");
            return false;
        }
        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }
        try {
            //上传文件
            file.transferTo(dest); //保存文件

            //数据存入数据库
            User loginUser = (User)request.getSession().getAttribute("loginUser");
            Video video =new Video();
            video.setUid(loginUser.getUid());
            video.setVtag(vtag);
            video.setVname(vname);
            video.setDate(new Date());
            video.setIntroduce(introduce);
            video.setUrl("/video/videourl/true/" +fileName);
            videoMapper.inservideo(video);
        } catch (IOException e) {
            map.put("msguploading","上传失败,请先检查上传文件是否按照要求,若不能解决再联系管理员.");
            return false;
        }

        return true;
    }
public interface UserService{
    boolean uploadingVideo(HttpServletRequest request, String vname, String vtag, String introduce, Map<String,Object> map, MultipartFile file);//上传视频
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值