若依-vue图片上传本地改OSS前台以及后台-附带oss图片上传工具类

文章介绍了在若依框架的SpringVue版本中,如何从本地图片上传切换到使用OSS(阿里云对象存储)进行图片上传。作者提供了后台代码示例,展示如何集成OssUtil工具类进行文件上传,并解决了前端图片回显时因路径问题导致的显示异常,通过注释掉不必要的路径拼接实现正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阿丹:

        在二次开发若依的过程中发现若依的图片上传的默认的是在本地,在spring-vue版本中,如果要将平台上线那么就需要考虑这个问题,要使用fastdfs或者oss来完成代替本地的图片上传。

本篇文章我使用了oss来完成图片上传以及前台的api添加拼接路径完成

后台代码

我们首先要了解和观察若依后台是如何进行图片上传的

这里是若依后台图片上传的代码,通过本地图片上传的工具类,来完成图片上传。

  @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        try
        {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
//            String fileName = OssUtil.uploadMultipartFile(file);
//            System.out.println(fileName);
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", fileName);
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

通过图片上传之后,使用ajax来封装了返回值内容,在前台进行赋值。 

后台二开思路

 通过引用oss上传工具类来完成图片上传的路径来完成。

并将返回值进行替换即可

这里提供一下我的oss图片上传的工具类

oss文件上传工具类

package com.ruoyi.common.utils.file;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Oss服务调用
 */
@Log4j2
public class OssUtil {



    /**
     * Endpoint 存储对象概述  阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限  访问路径前缀  存储对象概述
     */
    private static String endPoint = "oss-cn-shanghai.aliyuncs.com";
    private static String accessKeyId = "替换成自己的accessKeyId ";
    private static String accessKeySecret = "替换成自己的accessKeySecret";
    private static String accessPre = "https://dzlmuyu.oss-cn-shanghai.aliyuncs.com/";

    /**
     * bucket名称
     * @return
     */
    private static String bucketName = "dzlmuyu";

    private static OSS ossClient ;

    static {
        ossClient = new OSSClientBuilder().build(
                endPoint,
                accessKeyId,
                accessKeySecret);
        log.info("oss服务连接成功!");
    }

    /**
     * 默认路径上传本地文件
     * @param filePath
     */
    public static String uploadFile(String filePath){
        return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath);
    }

    /**
     * 默认路径上传multipartFile文件
     * @param multipartFile
     */
    public static String uploadMultipartFile(MultipartFile multipartFile) {
        return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile);
    }
    /**
     * 上传 multipartFile 类型文件
     * @param bucketName
     * @param ossPath
     * @param multipartFile
     */
    public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){
        InputStream inputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
    }

    /**
     * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) {
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));

        // 上传
        ossClient.putObject(putObjectRequest);
        return accessPre+ossPath;
    }

    /**
     * 使用文件流上传到指定的bucket实例
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){

        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
    }

    public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){
        ossClient.putObject(bucketName, ossPath, inputStream);
    }

    /**
     * 下载
     * @param ossFilePath
     * @param filePath
     */
    public static void downloadFile(String ossFilePath , String filePath ){
        downloadFileForBucket(bucketName , ossFilePath , filePath);
    }
    /**
     * 下载
     * @param bucketName 实例名称
     * @param ossFilePath oss存储路径
     * @param filePath 本地文件路径
     */
    public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){
        ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
    }

    /**
     *
     * @return
     */
    public static String getOssDefaultPath(){
        LocalDateTime now = LocalDateTime.now();
        String url =
                now.getYear()+"/"+
                now.getMonth()+"/"+
                now.getDayOfMonth()+"/"+
                now.getHour()+"/"+
                now.getMinute()+"/";
        return url;
    }

    public static String getOssFilePath(String filePath){
        String fileSuf = filePath.substring(filePath.indexOf(".") + 1);
        return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf;
    }

}

后台二开更改

引入oss工具类,

 使用oss工具类的uploadMultipartFile(file)这个方法,返回的直接就是可访问的路径,也就是说直接就是静态资源。所以可以直接将fileName赋值,将原本的代码注释掉。

后台修改完成

 前台二开更改

后台更改完毕现在出现问题为:

        

发现后台可以成功上传,但是前台图片无法正常回显

检查元素发现

图片的src被添加上前缀“/dev-api”

通过ruoyi-ui中的文件发现问题,在配置返回的原因后将路径进行了拼接。 

所以只需要将拼接的代理注释掉即可。 

功能测试正常 

 

### 使用 `el-upload` 组件上传单张图片到阿里云 OSS 的解决方案 #### 安装依赖 为了能够使用阿里云 OSS 进行文件上传,需先安装 `ali-oss` 插件。这可以通过 npm 来完成。 ```bash npm install ali-oss --save ``` 此命令会将所需 SDK 添加到项目中以便后续调用[^1]。 #### 创建 OSS 实例配置文件 接着,在项目的合适位置创建名为 `oss.js` 文件用于初始化并返回一个新的 OSS Client 实例: ```javascript // oss.js import OSS from 'ali-oss'; export default function createOssClient(config) { return new OSS({ ...config, // 可选参数设置区域、访问密钥ID、私钥以及bucket名称等必要信息 }); } ``` 上述代码片段展示了如何通过传入适当配置来实例化一个客户端对象[^3]。 #### Vue 组件集成 对于基于 Element UI 开发的应用程序来说,可以直接利用其提供的 `el-upload` 组件来进行文件选择和提交操作。下面是一个简单的例子说明怎样结合前面定义好的 OSS 工具类实现图片上传功能: ```html <template> <div class="upload-demo"> <el-upload :action="''" list-type="picture-card" :auto-upload="false" :on-change="handleChange" :before-upload="handleBeforeUpload" :limit="1" ref="uploadRef" > <i slot="default" class="el-icon-plus"></i> <div slot="file" slot-scope="{ file }"> <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" /> <span class="el-upload-list__item-actions"> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"> <i class="el-icon-zoom-in"></i> </span> <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)"> <i class="el-icon-download"></i> </span> <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file)"> <i class="el-icon-delete"></i> </span> </span> </div> </el-upload> <!-- 图片预览对话框 --> <el-dialog :visible.sync="dialogVisible"> <img width="100%" :src="dialogImageUrl" alt="" /> </el-dialog> </div> </template> <script> import createOssClient from './path/to/your/oss'; // 替换成实际路径 export default { data() { return { dialogImageUrl: '', dialogVisible: false, client: null, // 存储OSS客户端实例 }; }, methods: { async initOssClient() { const config = {}; // 填写您的STS临时凭证或其他认证方式获取的信息 this.client = await createOssClient(config); }, handleBeforeUpload(file) { // 在这里可以根据需求做些前置处理比如尺寸校验或者格式过滤 console.log('准备上传:', file); // 返回 true 表示允许继续执行默认行为;如果想阻止则应显式地return false; return true; }, handleChange(file, fileList) { if (fileList.length > 0 && !this.disabled) { let f = fileList[fileList.length - 1]; this.uploadFile(f.raw).then((res) => { console.log(res); }).catch(err => { console.error(err.message || err); }) } }, uploadFile(rawFile) { return new Promise(async(resolve, reject)=>{ try{ const result = await this.client.put(`/${Date.now()}-${rawFile.name}`, rawFile); resolve(result); } catch(error){ reject(error); } }); } // 其他方法... }, }; </script> ``` 这段代码实现了基本的功能逻辑,包括但不限于: - 初始化 OSS 客户端; - 控制文件的选择过程; - 自定义上传前后的钩子函数; - 将选定的文件发送给服务器保存,并接收响应数据[^2]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值