文件上传阿里云OSS以及本地图片服务器搭建

目录

一、阿里云OSS准备工作

登录阿里云官网,开通对象存储OSS。阿里云

阿里云OSS的官网:阿里云OSS官网

创建Bucket实例

按照下面的操作创建实例:

获取AccessKey



点击创建AccessKey,出现下面页面,需要进行认证

按照如下方式;安装SDK。


要求jdk在7以上

maven依赖:

xml 复制代码
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

如果使用的是Java 9及以上的版本,则需要添加以下JAXB相关依赖。

xml 复制代码
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

二、SpringBoot项目阿里云OSS上传配置

在创建的SpringBoot当中进行阿里云OSS的配置,之后导入接口就可以使用。

导入两个工具类:

AliyunOSSOperator里的内容如下:

java 复制代码
package com.qcby.util;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Component
public class AliyunOSSOperator {

    @Autowired
    private AliyunOSSProperties aliyunOSSProperties;

    public String upload(byte[] content, String originalFilename) {
        String endpoint = aliyunOSSProperties.getEndpoint();
        String bucketName = aliyunOSSProperties.getBucketName();
        String region = aliyunOSSProperties.getRegion();
        String accessKeyId = aliyunOSSProperties.getAccessKeyId();
        String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();

        // 生成存储路径:yyyy/MM/uuid.扩展名
        String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
        String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
        String objectName = dir + "/" + newFileName;

        // 使用 DefaultCredentialProvider 直接传入 AK/SK
        DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // 配置 OSS Client(可选,如启用 V4 签名)
        ClientBuilderConfiguration clientConfig = new ClientBuilderConfiguration();
        clientConfig.setSignatureVersion(SignVersion.V4);

        // 创建 OSSClient 实例
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialProvider)  // 使用 AK/SK 凭证
                .clientConfiguration(clientConfig)
                .region(region)
                .build();

        try {
            // 上传文件
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));

            // 返回文件的访问 URL(如:https://bucket.endpoint/objectName)
            return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;
        } finally {
            ossClient.shutdown();  // 关闭 OSSClient
        }
    }
}

AliyunOSSProperties内容文件如下:

java 复制代码
package com.qcby.util;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
    private String endpoint;
    private String bucketName;
    private String region;
    private String accessKeyId;
    private String accessKeySecret;

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }
}

通过这两个类就可以将图片文件等上传到阿里云OSS当中。

上传接口:

java 复制代码
package com.qcby.controller;

import com.qcby.entity.Result;
import com.qcby.util.AliyunOSSOperator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
//上传接口
@Controller
public class UploadController {
    @Autowired
    private AliyunOSSOperator aliyunOSSOperator;
    @RequestMapping("/upload")
    @ResponseBody
    public Result uploadFile(MultipartFile file) throws Exception {
        String originalFilename = file.getOriginalFilename();
        byte[] bytes = file.getBytes();
        String url = aliyunOSSOperator.upload(bytes,originalFilename);
        return new Result().success(url);
    }
}

三、SSM项目阿里云OSS上传配置

在SSM项目中需要在SpringMvc.xml加入一些配置,配置如下,加入org.springframework.web.multipart.commons.CommonsMultipartResolve

xml 复制代码
 <!-- 配置MultipartResolver用于文件上传 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上传文件最大大小,10MB -->
        <property name="maxUploadSize" value="10485760"/>
        <!-- 上传文件单个最大大小,10MB -->
        <property name="maxUploadSizePerFile" value="10485760"/>
        <!-- 内存中最大尺寸,2MB -->
        <property name="maxInMemorySize" value="2097152"/>
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 解析请求的延迟时间 -->
        <property name="resolveLazily" value="true"/>
    </bean>

同时需要在web.xml当中的dispatcher配置中加入

xml 复制代码
    <multipart-config>
      <max-file-size>10485760</max-file-size>      <!-- 10MB -->
      <max-request-size>10485760</max-request-size> <!-- 10MB -->
      <file-size-threshold>2097152</file-size-threshold> <!-- 2MB -->
    </multipart-config>

则dispatcher中的所有配置如下:

xml 复制代码
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <!-- 添加multipart配置 -->
    <multipart-config>
      <max-file-size>10485760</max-file-size>      <!-- 10MB -->
      <max-request-size>10485760</max-request-size> <!-- 10MB -->
      <file-size-threshold>2097152</file-size-threshold> <!-- 2MB -->
    </multipart-config>
  </servlet>

同时AliyunOSSProperties类需要做如下修改:

java 复制代码
package com.qcby.util;

import org.springframework.stereotype.Component;

@Component
public class AliyunOSSProperties {
    private String endpoint="https://oss-cn-beijing.aliyuncs.com";
    private String bucketName="lyf-java-ai";
    private String region="cn-beijing";
    private String accessKeyId="LTAI5tJJea7CiJc8Y9EKWyMB";
    private String accessKeySecret="GkqCMu69g77NzWoTcD1S5UB2yFAEvV";

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }
}

四、本地文件服务器搭建以及文件上传

本地文件服务器需要利用到Tomcat,需要将Tomcat设置为可以上传的模式。

修改conf里面的web.xml文件,将项目的只读关闭。

xml 复制代码
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

文件上传的接口如下:

java 复制代码
package com.example.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.util.PropReader;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

@Controller
@RequestMapping("/upload")
public class UploadController {

    @RequestMapping("/uploadFile")
    public void uploadFile(HttpServletRequest request, HttpServletResponse response, String lastImage, @RequestParam(value = "fileType") String type) throws IOException {

        System.out.println(type+"类型是 dasdasd");
        //把Request做强制转换
        MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = mr.getFileMap();
        Set<String> keySet = fileMap.keySet();
        Iterator<String> iterator = keySet.iterator();
        String key = iterator.next();
        //获得到上传的文件
        MultipartFile multipartFile = fileMap.get(key);
        byte[] bytes = multipartFile.getBytes();

        //获得文件的原始文件名
        String originalFilename = multipartFile.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName = UUID.randomUUID().toString();
        fileName = fileName + suffix;

        //创建jersy的客户端
        Client client = Client.create();

        //删除老图片
        if(StringUtils.isNotBlank(lastImage)){
            WebResource resource1 = client.resource(lastImage);
            resource1.delete();
        }

        //resource的参数文件服务器上的文件的绝对路径
        WebResource resource = client.resource(PropReader.read("filePath")+"/"+type+"/"+fileName);
        resource.put(bytes);

        JSONObject jo = new JSONObject();
        String realPath = PropReader.read("filePath")+"/"+type+"/"+fileName;
        String relativePath = "/"+type+"/"+fileName;
        jo.put("realPath", realPath);
        jo.put("relativePath", relativePath);

        System.out.println("真实的路径"+realPath);
        System.out.println("相对的路径"+relativePath);
        response.getWriter().write(jo.toString());
    }
    @RequestMapping("/uploadFileMp3")
    public void uploadFileMp3(HttpServletRequest request, HttpServletResponse response, String lastMp3, String fileType) throws IOException {
        System.out.println(lastMp3);
        //把Request做强制转换
        MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = mr.getFileMap();
        Set<String> keySet = fileMap.keySet();
        Iterator<String> iterator = keySet.iterator();
        String key = iterator.next();
        //获得到上传的文件
        MultipartFile multipartFile = fileMap.get(key);
        byte[] bytes = multipartFile.getBytes();

        //获得文件的原始文件名
        String originalFilename = multipartFile.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName = UUID.randomUUID().toString();
        fileName = fileName + suffix;

        //创建jersy的客户端
        Client client = Client.create();

        //删除老音频
        if(StringUtils.isNotBlank(lastMp3)){
            System.out.println(lastMp3);
            WebResource resource1 = client.resource(lastMp3);
            resource1.delete();
        }

        //resource的参数文件服务器上的文件的绝对路径
        WebResource resource = client.resource(PropReader.read("filePath")+"/"+fileType+"/"+fileName);
        resource.put(bytes);

        JSONObject jo = new JSONObject();
        jo.put("realPath", PropReader.read("filePath")+"/"+fileType+"/"+fileName);
        jo.put("relativePath", "/"+fileType+"/"+fileName);

        response.getWriter().write(jo.toString());
    }
}
相关推荐
悟能不能悟3 小时前
dcpatchscan.exe这是什么
运维·服务器
kyle~3 小时前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
wanhengidc3 小时前
云手机 流畅运行
运维·服务器·安全·游戏·智能手机
NiKo_W3 小时前
Linux 进程通信——基于责任链模式的消息队列
linux·服务器·消息队列·责任链模式·进程通信
云飞云共享云桌面3 小时前
广东某模具制造工厂用一台云服务器供8个研发设计同时用
linux·运维·服务器·网络·自动化·制造
Le1Yu3 小时前
服务注册、服务发现、OpenFeign及其OKHttp连接池实现
java·服务器
2401_865854884 小时前
腾讯云的游戏盾怎么样
游戏·云计算·腾讯云
2503_924806854 小时前
分辨海外IP是否为住宅IP的方法
服务器·网络协议·tcp/ip
熙客4 小时前
阿里云负载均衡SLB的使用
网络·阿里云·云原生·云计算·负载均衡