Java基于阿里云OSS实现视频上传

file类型的input输入框获得value时可使用:

<input type="file" name="videoPath" id="vv"><br>
var formData = new FormData()
formData.append("videoPath",document.getElementById("vv").files[0]);
fileElementId: "vv", //文件选择框的id属性,即<input type="file">的id

上传时首先添加的是视频的ID、标题、内容,存储之后再次调用ajax修改视频的路径和封面的地址。

jsp页面

//上传视频
        function addVideo() {
            $.ajax({
                url: "${path}/video/addVideo",
                data: $("#aa").serialize(),
                dataType: "json",
                success: function (data) {
                    if (data.add == "SUCCESS") {
                        alert("文件上传中")
                     
                        var formData = new FormData()
                        formData.append("videoPath", document.getElementById("vv").files[0]);
                        $.ajax({
                            url: "${path}/video/headUpload?id=" + data.id,
                            dataType: 'json',
                            method: 'POST', //提交方式
                            async: false,//安全协议提交
                            data: formData,
                            processData: false, // 数据不做处理
                            contentType: false, // 不要设置Content-Type请求头内容类型
                            success: function (data) {
                                pageInit();
                                //添加警告添加成功提示
                                $("#addOneClassOk").show()
                                //设置隐藏
                                setTimeout(function () {
                                    $("#addOneClassOk").hide()
                                    $('#myModal').modal('hide')
                                    document.getElementById("aa").reset();
                                }, 2000)

                            }
                        })
                    }
                }
            });
        }


<form id="aa">
     标题:<input type="text" name="title"><br>
     描述:<input type="text" name="brief"><br>
     视频:<input type="file" name="videoPath" id="vv"><br>
     类别:<select id="cat" name="categoryId"></select>
</form>

controller层

@RequestMapping("headUpload")
    public Map<String, String> headUpload(MultipartFile videoPath, String id) {
        videoService.headUpload(videoPath, id);
        Map<String, String> map = new HashMap<>();
        map.put("upload", "SUCCESS");
        return map;
    }

service层

@Override
    public void headUpload(MultipartFile videoPath, String id) {

        //1.获取文件名
        System.out.println("1111111111111111111111111" + videoPath);
        String filename = videoPath.getOriginalFilename();
        //给文件拼接时间戳
        String newName = new Date().getTime() + "-" + filename;
        String fileNames = "video/" + newName;
        //4.文件上传
        AliyunOSSUtil.uploadFileByte(videoPath, "yingx-lrj", fileNames);
        //2.截取视频封面
        //2.1.拆分字符串
        String[] split = newName.split("\\.");
        String coverName = split[0];
        //2.2.拼接封面名
        String coverNames = coverName + ".jpg";
        /*2.3.截取视频封面
         * 视频截取帧
         * 参数:
         *   bucketName:存储空间名
         *   fileName:文件名
         * */
        URL url = AliyunOSSUtil.videoInterceptCover("yingx-lrj", fileNames);
        /*
         * 3.上传视频封面至阿里云
         * 参数:
         *   netPath:网络路径
         *   bucketName:存储空间名
         *   fileName:指定文件名
         * */
        try {
            AliyunOSSUtil.uploadNetFile(url.toString(), "yingx-lrj", "cover/" + coverNames);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //拼接视频网络地址
        String headNetUrl = "https://yingx-lrj.oss-cn-shanghai.aliyuncs.com/" + fileNames;
        //拼接视频封面
        //5.数据修改
        Video video = videoDao.queryById(id);
        video.setCoverPath("https://yingx-lrj.oss-cn-shanghai.aliyuncs.com/cover/" + coverNames);
        video.setVideoPath(headNetUrl);
        System.out.println(headNetUrl);
        videoDao.update(video);
    }

AliyunOSSUtil.java 文件

package com.util;

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

public class AliyunOSSUtil {

    private static String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
    private static String accessKeyId = "LTAI4GKk9sRLQBP25dBYBmkE";
    private static String accessKeySecret = "M7B1dHqF5leZOYrHfxZVRyfofG9sfp";

    /*
     * 创建存储空间
     * 参数:
     * bucketName:存储空间名
     * */
    public static void insertBucket(String bucketName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 创建存储空间。
        ossClient.createBucket(bucketName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /*
     * 上传本地文件
     * 参数:
     *   bucketName:存储空间名
     *   fileName:文件名
     *   localFile: 本地文件路径
     * */
    public static void uploadLocalFiles(String bucketName, String fileName, String localFile) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, new File(localFile));
        // 上传文件。
        ossClient.putObject(putObjectRequest);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    //
    /*
     * 文件下载到本地
     * 参数:
     *   bucketName:存储空间名
     *   fileName:文件名
     *   localFile: 本地文件路径
     * */
    public static void download(String bucketName, String fileName, String localFile) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        ossClient.getObject(new GetObjectRequest(bucketName, fileName), new File(localFile));
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /*
     * 删除文件
     * 参数:
     *   bucketName:存储空间名
     *   fileName:文件名
     * */
    public static void deleteFile(String bucketName, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
        ossClient.deleteObject(bucketName, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }


    /*
     * 上传字节数组
     * 参数:
     *   headImg:MultipartFile类型的文件
     *   bucketName:存储空间名
     *   fileName:文件名
     * */
    public static void uploadFileByte(MultipartFile headImg, String bucketName, String fileName) {

        //转换为字节数组
        byte[] bytes = null;
        try {
            bytes = headImg.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传Byte数组。
        ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(bytes));
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /*
     * 视频截取帧
     * 参数:
     *   bucketName:存储空间名
     *   fileName:文件名
     * */
    public static URL videoInterceptCover(String bucketName, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 设置视频截帧操作。
        String style = "video/snapshot,t_1000,f_jpg,w_800,h_600";
        // 指定过期时间为10分钟。
        Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10);
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, fileName, HttpMethod.GET);
        req.setExpiration(expiration);
        req.setProcess(style);
        URL signedUrl = ossClient.generatePresignedUrl(req);
        //System.out.println(signedUrl);
        // 关闭OSSClient。
        ossClient.shutdown();
        return signedUrl;
    }

    /*
     * 上传网络流至阿里云
     * 参数:
     *   netPath:网络路径
     *   bucketName:存储空间名
     *   fileName:指定文件名
     * */
    public static void uploadNetFile(String netPath, String bucketName, String fileName) throws IOException {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 上传网络流。
        InputStream inputStream = new URL(netPath).openStream();
        ossClient.putObject(bucketName, fileName, inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    //测试
    public static void main(String[] args) {

    }
}


版权声明:本文为qq_37287018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。