SpringMvc(四)普通的文件、elementui 异步上传到OSS文件服务器

1.文件上传到本地服务器的缺点

缺点:

1. 当服务器重启,本地服务的文件会清空。
2. 搭建服务器集群。A服务器, B服务器......... 
    客户第一次上传时访问的是A服务器。
    客户第二次访问文件,访问的是B服务器,此时访问不到第一次的文件。

如何解决本地服务器上传的缺点:

(1)自己搭建一个文件服务器。不会重启。维护。

(2) 使用第三方的文件服务器.

2. 普通的文件上传到OSS文件服务器

(1)引入阿里云的OSS依赖

    <!--oss的依赖-->
    <dependency>
      <groupId>com.aliyun.oss</groupId>
      <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.10.2</version>
    </dependency>

(2)java代码(带有注释的都需要自行修改)

public static void main(String[] args) {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "*************";
        String accessKeySecret = "****************";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "***";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "imgs/zp1.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "C:\\Users\\Z\\Desktop\\1.jpg";

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

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

3. elementui 异步上传OSS服务器

 (1)前端代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!--引入element得css样式-->
    <link type="text/css" rel="stylesheet" href="css/index.css"/>
    <!--引入vue得js文件 这个必须在element之前引入-->
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript" src="js/qs.min.js"></script>
    <script type="text/javascript" src="js/axios.min.js"></script>
    <!--element得js文件-->
    <script type="text/javascript" src="js/index.js"></script>
</head>
<body>
<div id="app">
    <el-upload
            class="avatar-uploader"
            action="upload01"
            :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>
<style>
    .avatar-uploader .el-upload {
        border: 1px dashed #d9d9d9;
        border-radius: 6px;
        cursor: pointer;
        position: relative;
        overflow: hidden;
    }
    .avatar-uploader .el-upload:hover {
        border-color: #409EFF;
    }
    .avatar-uploader-icon {
        font-size: 28px;
        color: #8c939d;
        width: 178px;
        height: 178px;
        line-height: 178px;
        text-align: center;
    }
    .avatar {
        width: 178px;
        height: 178px;
        display: block;
    }
</style>

<script>
    var app = new Vue({
        el:"#app",
        data: {
              imageUrl: ''
        },
        methods: {
            handleAvatarSuccess(res, file) {
                this.imageUrl = res.data;
            },
            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>
</html>

(2) controller接口

@Controller
public class UploadController {

    @RequestMapping("upload01")
    public Map upload01(MultipartFile file, HttpServletRequest request){
        try{
            //获取上传服务器目录路径
            String path = request.getSession().getServletContext().getRealPath("upload");
            //判断该目录是否存在
            File url = new File(path);
            if(!url.exists()){
                url.mkdirs();
            }
            //设置文件的新名字        生成一个随机ID             把ID中的"-" 替换为“”                   拼接文件原来的名字
            String filename = UUID.randomUUID().toString().replace("-", "") + file.getOriginalFilename();
            File target = new File(path+"/"+filename);
            file.transferTo(target);

            Map map = new HashMap();
            map.put("code",2000);
            map.put("msg","上传成功");
            //回显到网页
            map.put("data","http://localhost:8080/springmvc_19/upload/"+filename);
            return map;
        }catch (Exception e){
            e.printStackTrace();
        }

        Map map = new HashMap();
        map.put("code","5000");
        map.put("msg","上传失败");
        return map;
    }
}

4.综合实例 -----注册

注册页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!--引入element得css样式-->
    <link type="text/css" rel="stylesheet" href="css/index.css"/>
    <!--引入vue得js文件 这个必须在element之前引入-->
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript" src="js/qs.min.js"></script>
    <script type="text/javascript" src="js/axios.min.js"></script>
    <!--element得js文件-->
    <script type="text/javascript" src="js/index.js"></script>
    <style>
        #app{
            border: 1px solid gray;
            width: 400px;
            height: 450px;
        }
    </style>
</head>
<body>
<div id="app">
    <el-form label-width="80px" :model="userForm">
        <el-form-item label="头像:">
            <el-upload
                    class="avatar-uploader"
                    action="user/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>
        </el-form-item>
        <el-form-item label="名字">
            <el-input v-model="userForm.username"></el-input>
        </el-form-item>
        <el-form-item label="密码">
            <el-input v-model="userForm.password"></el-input>
        </el-form-item>
        <el-form-item label="地址">
            <el-input v-model="userForm.address"></el-input>
        </el-form-item>
        <el-form-item >
            <el-button type="primary" @click="onSubmit">提交</el-button>
        </el-form-item>
    </el-form>
</div>

<script>
    var app=new Vue({
        el:"#app",
        data:{
            userForm:{},
            imageUrl:""
        },
        methods:{
            handleAvatarSuccess(result,file){
                console.log( result);
                this.imageUrl=result.data;
                //为表单对象添加头像地址的属性
                this.userForm.avatarUrl=this.imageUrl;
            },
            //提交
            onSubmit(){
                axios.post("user/addUser",this.userForm).then(function(result){

                });
            },
            //上传前触发的方法
            beforeAvatarUpload(file) {
                const isJPG = file.type === 'image/jpeg';
                const isPNG = file.type === 'image/png';
                const isLt2M = file.size / 1024 / 1024 < 2;
                if (!isLt2M) {
                    this.$message.error('上传头像图片大小不能超过 2MB!');
                }
                return isJPG  && isLt2M || isPNG && isLt2M;
            }
        }
    })
</script>
<style>
    .avatar-uploader .el-upload {
        border: 1px dashed #d9d9d9;
        border-radius: 6px;
        cursor: pointer;
        position: relative;
        overflow: hidden;
    }
    .avatar-uploader .el-upload:hover {
        border-color: #409EFF;
    }
    .avatar-uploader-icon {
        font-size: 28px;
        color: #8c939d;
        width: 150px;
        height: 150px;
        line-height: 150px;
        text-align: center;
    }
    .avatar {
        width: 100px;
        height: 150px;
        display: block;
    }
</style>
</body>
</html>

创建工具类

package com.zsy.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.Calendar;
import java.util.UUID;

/**
 * @author : zhou
 * @date : 18:18 2022/6/10
 */
public class OSSUtil {
    public static String upload(MultipartFile file){
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "******************";
        String accessKeySecret = "**************";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "********";
        //上传OSS后的名称   会根据日期创建文件夹
        String objectName = fileName(file);

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

        try {
            InputStream inputStream = file.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        String url = "https://"+bucketName+"."+endpoint+"/"+objectName;
        return url;
    }

    //获取上传到oss的名字
    private static String fileName(MultipartFile file){
        Calendar calendar = Calendar.getInstance();
        String name =
                calendar.get(Calendar.YEAR)+"/"+
                        (calendar.get(Calendar.MONTH)+1)+"/"+
                        calendar.get(Calendar.DATE)+"/"+
                        UUID.randomUUID().toString().replace("-","")+
                        file.getOriginalFilename();

        return name;
    }
}

controller控制层

package com.zsy.controller;

import com.zsy.entity.User;
import com.zsy.util.CommonResult;
import com.zsy.util.OSSUtil;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author : zhou
 * @date : 21:53 2022/6/10
 */
@RestController
@RequestMapping("user")
public class UserController {

    @RequestMapping("upload")
    public CommonResult upload(MultipartFile file){
        try{
            String avatar = OSSUtil.upload(file);
            return  new CommonResult(2000,"上传成功",avatar);
        }catch (Exception e){
            e.printStackTrace();
        }
        return new CommonResult(5000,"上传失败",null);
    }


    @RequestMapping("addUser")
    public CommonResult addUser(@RequestBody User user){
        System.out.println(user);
        return new CommonResult(2000,"注册成功",null);
    }
}

5.特殊注解

@RestController----类上等价于 @COntroller+@ResponseBody
    该注解下所有的方法都是返回json数据

@RequestMapping: 作用: 把请求路径映射到响应的方法上。通过它来指定控制器可以处理哪些URL请求,可以写在接口上

@RequestParam(value = "u"):设置你接受的请求参数名。查询参数

@RequestMapping(value = "/addUser",method = RequestMethod.POST)
       method:表示该接口接受的请求方式.不设置可以接受任意请求方式。

@GetMapping("addUser"):表示只接受get提交方式的请求  

@PostMapping("addUser):表示只接受post提交方式的请求  

  

@RequestBody:把请求的json数据转换为java对象。从前端到后端
@ResponseBody:把java转换为json数据   从后端转前端

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring MVC中,可以使用MultipartResolver来处理文件上传。MultipartResolver是一个接口,Spring提供了两个实现类:CommonsMultipartResolver和StandardServletMultipartResolver。前者是通过Jakarta Commons FileUpload实现的,后者是通过Servlet 3.0的API实现的。这里以CommonsMultipartResolver为例介绍文件上传。 1. 在Spring配置文件中添加multipartResolver配置: ``` <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置上传文件的最大值--> <property name="maxUploadSize" value="5242880"/> </bean> ``` 2. 在Controller中编写上传文件的处理方法: ``` @RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String uploadFile(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { //获取文件名 String fileName = file.getOriginalFilename(); //获取文件的字节数组 byte[] bytes = file.getBytes(); //将字节数组写入到文件中 String filePath = "/path/to/save/file/" + fileName; File outputFile = new File(filePath); OutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(bytes); outputStream.close(); //将上传文件的信息保存到数据库中 //... return "redirect:/success"; } catch (IOException e) { e.printStackTrace(); } } return "redirect:/error"; } ``` 在上面的方法中,@RequestParam("file")用于获取上传的文件,MultipartFile是Spring封装的文件上传对象,其中包含了上传文件的相关信息,例如文件名、大小、内容等。通过调用getOriginalFilename()方法可以获取文件名,通过调用getBytes()方法可以获取文件的字节数组。接着,将字节数组写入到文件中,最后将上传文件的相关信息保存到数据库中。 3. 将上传的文件存储到文件服务器上 如果需要将上传的文件存储到文件服务器上,可以使用FTPClient或SFTPClient等工具实现。具体实现方法可以参考FTPClient或SFTPClient的使用文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naaaaa.a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值