IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Springboot -文件图片上传功能 -> 正文阅读

[JavaScript知识库]Springboot -文件图片上传功能

Springboot -文件图片上传功能

典型案例:发微博,发微信朋友圈都用到文件上传功能

文件上传时,对页面的form表单有如下的要求

  • method =“post” 采用post方式提交数据
  • enctype = “multipart/form-data” 采用multipart格式长传文件
  • type = “file” 使用input的file控件上传

我采用的前端插件是Elment-ui+Vue

头部分-样式引入

<head>
    <meta charset="utf-8">
    <title>文件上传</title>

    <!-- 引入样式 -->
    <link rel="stylesheet" href="../plugins/elementui/index.css">
    <link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css">
    <link rel="stylesheet" href="../css/style.css">

</head>

body-页面插件使用

<body>
<div id="app">
    //文件上传的一个插件
    <el-upload
        class="upload-demo"
        action="http://localhost/index/upload"
        :on-change="handleChange"
        :file-list="fileList">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
   </el-upload>
    //图片上传的一个插件
    <el-upload
            class="avatar-uploader"
            action="http://localhost/index/upload"
            :show-file-list="false"
            :on-success="handleAvatarSuccess"
            :before-upload="beforeAvatarUpload">
        <img v-if="imageUrl" :src="imageUrl" class="avatar">
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>

</div>
</body>

script

<!-- 引入组件库 -->

<script src="../js/vue.js"></script>

<script src="../plugins/elementui/index.js"></script>

<script type="text/javascript" src="../js/jquery.min.js"></script>

<script src="../js/axios-0.18.0.js"></script>

<script>
    var vue = new Vue({
        el: '#app',
        data() {
            //文件的配置
                return {
                    fileList: [{
                        name: 'food.jpeg',
                        url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
                    }, {
                        name: 'food2.jpeg',
                        url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
                    }],
               //图片的配置
                    imageUrl: ''
                };
            },
            methods: {
                handleChange(file, fileList) {
                    this.fileList = fileList.slice(-3);
                },
                handleAvatarSuccess(res, file) {
                    this.imageUrl = URL.createObjectURL(file.raw);
                },
                beforeAvatarUpload(file) {
                    const isJPG = file.type === 'image/jpeg';
                    const isLt2M = file.size / 1024 / 1024 < 2;

                    if (!isJPG) {
                        this.$message.error('上传头像图片只能是 JPG 格式!');
                    }
                    if (!isLt2M) {
                        this.$message.error('上传头像图片大小不能超过 2MB!');
                    }
                    return isJPG && isLt2M;
                }
            }

    })
</script>
注意:其中Elment-ui可以帮我们自动上传并回显,需要更改action路径调用controller,将图片/文件的数据传给后台
    @PostMapping("/upload")
    public String upload(MultipartFile file){
        log.info(file.toString());
        return null;
    }

接受到文件信息

文件图片信息

强调:fileName = “file”,这里的fileName要和后面public String upload(MultipartFile xxx)中的xxx保持一致,建议都为file
  • 此时file还只是各临时文件,需要转存到指定的位置,否则本次请求后,临时文件会自动删除

解决方法就是:用file.transferTo(new File(…))方法将文件放置在指定目录下,可以通过yml文件配置路径解耦

//    获取yml中配置的指定路径
    @Value("${file.path}")
    private String basePath;

    @PostMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
//        获取原始文件名
        String originalFilename = file.getOriginalFilename();

//        动态截取文件或图片的后缀:.jpg等
        String suffix =  originalFilename.substring(originalFilename.lastIndexOf("."));

//        为了防止文件名一样出现覆盖问题,可以使用UUID随机生成
        String fileName = UUID.randomUUID().toString()+suffix;//sadfafiuefbf.jpg

//        创建一个目录对象,判断文件夹是否存在
        File dir = new File(basePath);
//         目录不存在,需要创建
        if (!dir.exists()){
            dir.mkdir();
        }

//        将文件转存到指定位置
        file.transferTo(new File(basePath+fileName));
//        返回文件名称
        return fileName;
    }

最后是要返回文件名称的,通过保存按钮提交表单,将图片名称存入数据库中


Springboot -文件图片下载功能

上传内容后,我们可以在response接受到上传的文件信息

  • 配置前端方法

  • 将上传的文件名获取,发出新的路径请求

     handleAvatarSuccess(response, file) {
                        this.imageUrl = `http://localhost/index/download?name=${response}`
                       //将图片存入数据库
                        this.cover = response.data
                    },
    
  • 后端的请求处理

    通过输入输出流来获取并回显到页面

  • //       文件下载
        @GetMapping("/download")
        public  void downLoad(String name, HttpServletResponse response) throws IOException {
    //       输入流,通过输入流读取文件内容
            FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));
    
    //        输出流,通过输出流将文件写回浏览器,在浏览器展示图片
            ServletOutputStream outputStream = response.getOutputStream();
    //        设置响应回去的文件类型
            response.setContentType("image/jpeg");
            int length = 0;
            byte[] bytes = new byte[1024];
    //        将文件内容读取到bytes数组里
            while((length = fileInputStream.read(bytes)) != -1){
    //            将内容输出
                outputStream.write(bytes,0,length);
    //            刷新
                outputStream.flush();
            }
    
    //        关闭资源
            outputStream.close();
            fileInputStream.close();
    
        }
    
    
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:47:38  更:2022-09-24 20:51:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:52:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码