对象存储?CRUD Boy实现对文件的增删改查

news2025/2/23 13:34:35

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

以下是正文!

对象存储是什么?

对象存储是一种数据存储方式,它将数据分割成不同的对象,并为每个对象分配一个唯一的标识符,用于访问和操作数据。这些对象被存储在多个服务器上,以确保数据的可靠性和可用性。对象存储适合存储大量数据,具有可扩展性、低成本和高安全性等特点。

这段话太专业了,以至于有点让人看不懂。私以为对象存储就是『分布式文件存储系统』,可能是我们只会用它来存储图片、视频、文档等文件吧😅,然后数据库(比如MySQL)只存储文件的访问链接。目前接触的对象存储有
阿里云对象存储OSS、天翼云对象存储融合版、自建对象存储MinIO。

  • 阿里云对象存储OSS

帮助文档链接

  • 天翼云对象存储融合版

帮助文档链接

  • MinIO对象存储

帮助文档链接

这三款对象存储产品对比如下

产品功能特点是否收费是否开源对接难易度
阿里云对象存储OSS阿里云OSS提供了丰富的存储、数据处理和分发功能,可以满足各种场景的需求收费不开源只需要ak/sk,然后看文档即可
天翼云对象存储融合版天翼云对象存储融合版主要面向移动互联网应用,提供了数据管理、在线处理等功能收费不开源只需要ak/sk,然后看文档即可
MinIO对象存储MinIO专注于提供高性能、高可用的对象存储服务。免费开源只需要ak/sk,然后看文档即可

总之有钱的话就买服务,没钱就自己搭,总有合适自己的😉。

对象存储和数据库的区别

各维度对比

存储数据结构数据处理存储方式可伸缩性
数据库存储数据库是基于表格的存储方式,每个表格有特定的列和行。数据库主要用于存储结构化数据,如文本、数字和日期等。数据库可以进行更复杂的数据处理,如查询、过滤和排序等。数据库通常使用关系型数据库或NoSQL数据库等数据库在扩展性上需要更多的运维和管理
对象存储对象存储是基于对象的存储方式,每个对象可以是任何类型的文件对象存储通常用于存储大量非结构化数据,如图片、视频和音频等对象存储通常使用分布式存储技术将数据分散存储在不同的节点上对象存储具有良好的扩展性,因此可以轻松地添加新的节点来处理更多的数据

项目对接流程图对比

CRUD之阿里云对象存储

1. 安装Java SDK

一般都是通过maven直接引入

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

2. 获取Client

官方获取Client代码示例

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";

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

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

我一般会将其变成一个Component

@Component
public class AliyunOssClient {

    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${aliyun.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;

    @Bean(name = "aliyunOssClient")
    public OSS aliyunOssClient() {
        // 构建并返回OSSClient
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

3. 增删改查操作

(1)对象公共读&上传和访问

官方文档

 /**
    * 简单上传-流式上传-公共读
    *
    * @param bucketName  bucket名称
    * @param key         文件名
    * @param inputStream 输入流
    * @return PutObjectResult 上传结果
    */
public static PutObjectResult putObjectByInputStreamAndPublicRead(String bucketName, String key,
        InputStream inputStream) {
        ObjectMetadata metadata = new ObjectMetadata();
        //设置StorageClass为Standard即为
        metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        //设置读写为公共读写
        metadata.setObjectAcl(CannedAccessControlList.PublicRead);
        // 准备OSS上传对象请求
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream);
        putObjectRequest.setMetadata(metadata);
        // 上传
        return ossClient.putObject(putObjectRequest);
}

当设置文件的访问权限为公共读时,直接拼接文件的访问链接就可以了,比如endpoint为oss-cn-hangzhou.aliyuncs.com,bucket为file-bucket,key为/test/file/1.png
那么访问链接就为:https://file-bucket.oss-cn-hangzhou.aliyuncs.com/test/file/1.png

(2)对象私有读&上传和访问

官方文档

 /**
     * 简单上传-流式上传-私有读写
     *
     * @param bucketName  bucket名称
     * @param key         文件名
     * @param inputStream 输入流
     * @return PutObjectResult 上传结果
     */
    public static PutObjectResult putObjectByInputStreamAndPrivate(String bucketName, String key,
        InputStream inputStream) {
        ObjectMetadata metadata = new ObjectMetadata();
        //设置StorageClass为Standard即为
        metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        //设置读写为公共读写
        metadata.setObjectAcl(CannedAccessControlList.Private);
        // 准备OSS上传对象请求
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream);
        putObjectRequest.setMetadata(metadata);
        // 上传
        return ossClient.putObject(putObjectRequest);
    }

当设置文件的访问权限为私有读时,直接拼接访问链接是没法访问该文件的,访问会报如下错误:

<Error>
<Code>AccessDenied</Code>
<Message>You do not have read permission on this object.</Message>
<RequestId>6488223453BCC63831BB3EC4</RequestId>
<HostId>file-bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
<EC>0003-00000005</EC>
</Error>

这时就需要对key进行加签操作了,加签代码如下:

 /**
     * 通过bucketName、key、过期时间生成文件访问链接(时效性)
     *
     * @param bucketName bucket名称
     * @param key        文件名
     * @param expiration 过期时间
     * @return 文件访问链接
     */
    public static String getSignObjectUrl(String bucketName, String key, Date expiration) {
        return ossClient.generatePresignedUrl(bucketName, key, expiration).toString();
    }

那么获取的链接格式就是这样了:https://file-bucket.oss-cn-hangzhou.aliyuncs.com/test/file/test.png?Expires=xxx&OSSAccessKeyId=xxxx&Signature=xxxx

(3)对象下载

官方文档

下载到文件

   /**
     * 通过bucketName、key、文件路径 下载OSS文件到本地文件
     *
     * @param bucketName bucket名称
     * @param key        文件名
     * @param pathName   本地文件路径
     */
    public static void getObjectToFile(String bucketName, String key, String pathName) {
        // 下载OSS文件到本地
        ossClient.getObject(new GetObjectRequest(bucketName, key), new File(pathName));
    }

流式下载

 /**
     * 通过bucketName、key 下载OSS变成字节流
     *
     * @param bucketName bucket名称
     * @param key        文件名
     */
    public static void getObjectToStream(String bucketName, String key) {
        OSSObject ossObject = null;
        BufferedReader reader = null;
        try {
            ossObject = ossClient.getObject(bucketName, key);
            reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
            while (true) {
                String line = null;
                line = reader.readLine();
                if (line == null) { break; }

                System.out.println("\n" + line);
            }
        } catch (IOException e) {
            log.error("下载oss文件异常", e);
        } finally {
            try {
                // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                reader.close();
                // ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                ossObject.close();
            } catch (IOException e) {
                log.error("关闭流发生异常", e);
            }
        }
    }

(4)对象删除

官方文档

   /**
     * 通过bucketName、key删除文件
     *
     * @param bucketName bucket名称
     * @param key        文件名
     */
    public static void delObject(String bucketName, String key) {
        // 删除文件或目录。如果要删除目录,目录必须为空。
        ossClient.deleteObject(bucketName, key);
    }

(5)图片处理

官方文档
这个接口目前只有阿里云有写文档,其他云都是一笔带过没有详细说明,作用是将上传到OSS的原始图片进行缩放、旋转、加水印等操作,非常好用,在此强烈安利一波!!!

  • 将图片缩放为固定宽高100 px
// 将图片缩放为固定宽高100 px。
String style = "image/resize,m_fixed,w_100,h_100";
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-resize.jpg并保存到本地。
// 填写本地文件的完整路径,例如D:\\localpath\\example-resize.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径只填写了本地文件名称(例如example-resize.jpg),则文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(request, new File("D:\\localpath\\example-resize.jpg"));
  • 从坐标(100,100)开始,将图片裁剪为宽高100 px
// 从坐标(100,100)开始,将图片裁剪为宽高100 px。
style = "image/crop,w_100,h_100,x_100,y_100";
request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-crop.jpg并保存到本地。
ossClient.getObject(request, new File("D:\\localpath\\example-crop.jpg"));
  • 将图片旋转90°
 // 将图片旋转90°。
style = "image/rotate,90";
request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-rotate.jpg并保存到本地。
ossClient.getObject(request, new File("D:\\localpath\\example-rotate.jpg"));
  • 在图片中添加文字水印。
// 在图片中添加文字水印。
// 文字水印的文字内容经过Base64编码后,再将编码结果中的加号(+)替换成短划线(-),正斜线(/)替换成下划线(_)并去掉尾部的等号(=),从而得到水印字符串。
// 指定文字水印的文字内容为Hello World,文字内容进行编码处理后得到的水印字符串为SGVsbG8gV29ybGQ。
style = "image/watermark,text_SGVsbG8gV29ybGQ";
request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-watermarktext.jpg并保存到本地。
ossClient.getObject(request, new File("D:\\localpath\\example-watermarktext.jpg"));

  • 在图片中添加图片水印。请确保水印图片已保存在图片所在Bucket中
// 在图片中添加图片水印。请确保水印图片已保存在图片所在Bucket中。
// 水印图片的完整路径经过Base64编码后,再将编码结果中的加号(+)替换成短划线(-),正斜线(/)替换成下划线(_)并去掉尾部的等号(=),从而得到水印字符串。
// 指定水印图片的完整路径为panda.jpg,完整路径进行编码处理后得到的水印字符串为cGFuZGEuanBn。
style = "image/watermark,image_cGFuZGEuanBn";
request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-watermarkimage.jpg并保存到本地。
ossClient.getObject(request, new File("D:\\localpath\\example-watermarkimage.jpg"));
      

除了这些之外还有很多其他的功能,大家可以自己看文档~
顺便说一个我们使用的案例

我们之前在开发项目的时候,做了个文章发布的功能,简单来说就是PC后台管理端发布文章,然后在微信小程序、H5小程序点击查看。文章的内容是包括图文的,有些文章图片上传的是原图,一张好几兆大小,用户在手机端查看文章时加载慢不说,那流量更是跑得飞起。我们就是用这个功能对图片进行等比例缩放,控制图片大小来解决的。

当时我们使用富文本框写的文章,这种文章会把图片、文字和dom元素混在一起,而且每张图片大小、分辨率都不同,这种情况下后端是没法对图片进行处理的,能处理图片的只有前端。为了解决这个问题,阿里云OSS提供了一个参数:x-oss-process。具体效果,我们直接看对比图:

从上图看,加了参数后,图片直接变小,但也模糊了。也就是说,图片根本不需要后端处理,前端自己拼接参数就可以处理图片了,非常的方便,而且原图链接也在前端,还可以做长按查看原图功能。

CRUD之天翼云对象存储

1. 安装Java SDK

同样都是通过maven直接引入,但是多了好几个依赖,毕竟不是自研的。

<!-- 天翼云 -->
<dependency>
  <groupId>cn.chinatelecom</groupId>
  <artifactId>oss-java-sdk</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.336</version>
</dependency>
<!-- 使用sts服务需要添加以下依赖 -->
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-sts</artifactId>
  <version>1.11.336</version>
</dependency>
<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.10.3</version>
</dependency>

2. 获取Client

我还是将其变成一个Component

@Component
public class TianyiyunOssClient {

    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${tianyiyun.accessKeyId}")
    private String accessKeyId;
    @Value("${tianyiyun.accessKeySecret}")
    private String accessKeySecret;

    @Bean
    public AmazonS3 getOssClient() {
        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKeyId, accessKeySecret);
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        EndpointConfiguration endpointConfiguration = new EndpointConfiguration(
            endpoint, Regions.DEFAULT_REGION.getName());
        return AmazonS3ClientBuilder.standard()
            //客户端设置
            .withClientConfiguration(clientConfiguration)
            //凭证设置
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            //endpoint设置
            .withEndpointConfiguration(endpointConfiguration)
            .build();
    }
}

3. 增删改查操作

(1)上传对象

官方文档

    /**
     * 简单上传-流式上传-公共读
     *
     * @param bucketName  bucket名称
     * @param key         文件名
     * @param inputStream 输入流
     * @return PutObjectResult 上传结果
     */
    public static PutObjectResult putObjectByInputStream(String bucketName, String key, InputStream inputStream) {
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        // 准备OSS上传对象请求
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, metadata);
        putObjectRequest.setMetadata(metadata);
        //设置上传对象的Acl为公共读,私有写
        putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
        // 上传
        return tianyiyunOssClient.putObject(putObjectRequest);
    }

基本和阿里云一模一样,这里就不赘述怎么实现公共读和私有读了,核心就是设置setCannedAcl。

(2)获取对象访问链接

官方文档


    /**
     * 生成预签名下载链接
     *
     * @param bucketName bucket名称
     * @param key        文件名
     * @param expiration 过期时间
     * @return 文件访问链接
     */
    public static String getObjectUrl(String bucketName, String key, Date expiration) {
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key)
            .withMethod(HttpMethod.GET)
            .withExpiration(expiration);
        return tianyiyunOssClient.generatePresignedUrl(request).toString();
    }

这里稍微和阿里云不太一样,虽然GeneratePresignedUrlRequest也有setExpiration方法,但好像不生效,必须要使用上面这种形式才可以加签,奇怪🤔。

(3)删除对象

官方文档

/**
     * 通过bucketName、key删除文件
     *
     * @param bucketName bucket名称
     * @param key        文件名
     */
    public static void delObject(String bucketName, String key) {
        // 删除文件或目录。如果要删除目录,目录必须为空。
        tianyiyunOssClient.deleteObject(bucketName, key);
    }

(4)图片处理

官方文档
这里天翼云的文档没有详细说明,但我还是找到了天翼云对象存储是怎么处理图片的。同阿里云的x-oss-process,天翼云的处理参数为x-amz-process。用法也和阿里云的一样,直接把参数拼接在url后面即可。

try {
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey)
            .withMethod(HttpMethod.GET)
            .withExpiration(expiration);
    // 在URL中添加额外参数
    request.addRequestParameter("x-amz-limit", String.format("rate=%d", 100));
    request.addRequestParameter("x-amz-process", "image/watermark,text_12345678");
    URL url = s3.generatePresignedUrl(request);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
}

CRUD之MinIO对象存储

1. 安装Java SDK

同上

     <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.5</version>
        </dependency>

2. 获取Client

同上,注册为Component

@Component
public class MinioOssClient {

    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;

    /**
     * 注入minio 客户端
     *
     * @return 客户端
     */
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
            .endpoint(endpoint)
            .credentials(accessKey, secretKey)
            .httpClient(getUnsafeOkHttpClient())
            .build();
    }

    private OkHttpClient getUnsafeOkHttpClient() {
        try {
            final TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws
                        CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
                        throws CertificateException {
                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[] {};
                    }
                }
            };

            X509TrustManager x509TrustManager = (X509TrustManager)trustAllCerts[0];
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, x509TrustManager);

            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
            return builder.build();

        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            throw new RuntimeException(e);
        }
    }

}

这里多了一个方法getUnsafeOkHttpClient方法,原因是MinIO是我们自建的,使用的https://ip:port的方式去调用,而不是域名方式。对接过这种地址的小伙伴都知道,如果不处理一下https的安全证书,调用的时候就会报错。该方法是为了解决SSL证书验证异常,即当请求的URL使用的是HTTPS协议时,如果证书无效或不被信任,会抛出SSLHandshakeException异常,通过自定义TrustManager和SSLSocketFactory来实现忽略证书的验证,从而避免SSL异常。

3. 增删改查操作

(1)上传对象

 /**
     * 简单上传-流式上传
     *
     * @param bucketName  bucket名称
     * @param key         文件名
     * @param inputStream 输入流
     * @return ObjectWriteResponse 上传结果
     */
    public static ObjectWriteResponse uploadInputStream(String bucketName, String key, InputStream inputStream)
        throws Exception {
        //设置权限
        Map<String, String> userMetadata = new HashMap<>();
        //设置为公有读
        userMetadata.put("access-control", "public-read");
        //设置为私有读
        // userMetadata.put("access-control", "private");
        // 准备OSS上传对象请求
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
            // bucketName
            .bucket(bucketName)
            // 文件名称
            .object(key)
            //设置文件权限
            .userMetadata(userMetadata)
            .stream(inputStream, inputStream.available(), -1)
            .build();
        // 上传文件
        return minioClient.putObject(putObjectArgs);
    }

(2)获取对象访问链接

  /**
     * 获取文件地址
     *
     * @param bucketName bucketName
     * @param key        文件名称
     * @param duration   过期时长
     * @param unit       过期时长单位
     * @return 文件地址
     */
    public static String getObjectUrl(String bucketName, String fileName, int duration, TimeUnit unit)
        throws Exception {
        // 查看文件地址
        return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
            // bucketName
            .bucket(bucketName)
            // 文件名称
            .object(fileName)
            // 过期参数
            .expiry(duration, unit)
            // 请求方式
            .method(Method.GET)
            // 构建参数
            .build()
        );
    }

(3)删除对象

    /**
     * 通过bucketName、key删除文件
     *
     * @param bucketName bucket名称
     * @param key        文件名
     */
    public static void delObject(String bucketName, String key) throws Exception {
        minioClient.removeObject(
            RemoveObjectArgs.builder()
                .bucket(bucketName)
                .object(key)
                .build());
    }

(4)图片处理

很可惜,MinIO没有图片处理的功能。

总结一下

这三种对象存储工具都是我在真实项目中使用过的,它们的使用流程相似,接口名称也差不多,但是在一些细节上还是有些不同的地方。为了让大家更好地了解它们,我在文章中都有标明区别。阿里云和天翼云使用起来比较方便,只需要购买服务就可以了。而MinIO就比较麻烦,需要自己搭建一个服务器环境,并在生产环境中满足主备、证书等方面的要求,这也让我在使用过程中踩了不少坑。不过,我会在新的文章中详细介绍如何搭建MinIO服务器以及如何解决它的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十九天|503.下一个更大元素II|42. 接雨水

LeetCode503.下一个更大元素II 基本思路&#xff1a;本题思路与739.每日方法思路相似&#xff0c;但是需要使用到循环数组&#xff0c;将两个nums数组拼接在一起&#xff0c;使用单调栈计算出每一个元素的下一个最大值&#xff0c;最后再把结果集即result数组resize到原数组大…

java 高校宿舍管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 高校宿舍管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

第六章 番外篇:webdataset

参考教程&#xff1a; https://github.com/pytorch/pytorch/issues/38419 https://zhuanlan.zhihu.com/p/412772439 https://webdataset.github.io/webdataset/gettingstarted/ 文章目录 背景WebDatasetwebdataset的生成webdataset的加载示例代码 背景 训练数据通常是以个体的…

霹雳吧啦 目标检测 学习笔记

霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频 目标检测篇github地址&#xff1b;GitHub - WZMIAOMIAO/deep-learning-for-image-processing: deep learning for image processing including classification and object-detection etc. 数据集 实例分割vs语义分割&a…

【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (7) AI语言模型

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

云安全的第一站:CSPM

在企业数字化转型和云计算技术的加持下&#xff0c;企业上云趋势势不可挡。与此同时&#xff0c;数据量加大&#xff0c;网络攻击日趋频繁&#xff0c;对企业来说&#xff0c;包括云计算安全在内的网络安全部署的重要性日益显现。 在Gartner2022年CIO技术执行官问卷调查中&…

chatgpt赋能python:Python怎么绕过短信验证

Python怎么绕过短信验证 短信验证以及其他形式的验证码已经成为了许多网站和应用程序保护用户隐私的常见方式。然而&#xff0c;对于某些特定的情况&#xff0c;用户可能需要绕过这些验证码&#xff0c;例如自动化测试或者爬取数据。那么&#xff0c;在Python中&#xff0c;我…

安装Hive

安装Hive 准备 安装Java环境&#xff1a;Hive需要Java环境支持&#xff0c;所以需要先安装Java。安装文档&#xff1a;http://t.csdn.cn/deBJu 安装MySQL数据库。http://t.csdn.cn/d24pN 下载Hive 下载Hive的二进制文件。 链接&#xff1a;https://pan.baidu.com/s/1fdg7…

管理类联考——英语二——技巧篇——写作——书信作文——经典方法论

第一节 书信作文谋篇布局 考研英语从2005年开始考查书信作文&#xff0c;迄今为止共考查过几十次。书信作文考查的信件种类繁多&#xff0c;其中建议信是考查最为频繁的信件类型。从考查内容来看&#xff0c;校园学习生活、职业发展、民生热点成为重点考查对象&#xff0c;这一…

hadoop 相关环境搭建

21.Windows下安装Hadoop&#xff1b; Hive MySQL版_hadoop hive windows安装_学无止境的大象的博客-CSDN博客 https://www.cnblogs.com/liugp/p/16244600.html 备注。因为beeline一直报错&#xff0c;最有一怒之下把hive的lib下所有jar都拷贝到hadoop的share\hadoop\common\lib…

2023 年 5 大机器人趋势

原创 | 文 BFT机器人 国际机器人联合会报告 法兰克福&#xff0c;2023 年 2 月 16 日——全球操作机器人的存量创下约 350 万台的新纪录——安装价值估计达到 157 亿美元。国际机器人联合会分析了 2023 年影响机器人技术和自动化的 5 大趋势。 2023 年 5 大机器人趋势 © 国…

2000-2021年全国1km分辨率的逐日PM10栅格数据

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们分享了来自于Zendo平台的1km分辨率的PM2.5栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff1a; 2000-2021年全国1km分辨率的逐日PM2.5栅格数据 2000-2021年全国1km分辨率的逐月PM2.5栅格…

双功能螯合剂Me-Tetrazine PEG7 NOTA,应用于生物和材料科学的研究中

文章关键词&#xff1a;双功能螯合剂&#xff0c;大环化合物 MeTz-PEG7-NOTA&#xff0c;NOTA PEG7 Me-Tetrazine&#xff0c;甲基四嗪-PEG7-NOTA &#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09;​ 一、Product structure&#xff1a;…

组合逻辑毛刺消除

目录 组合逻辑毛刺消除 1、简介 2、实验任务 3、程序设计 1、组合逻辑输出加寄存器 2、信号同步法 &#xff08;1&#xff09;信号延时同步法 &#xff08;2&#xff09;状态机控制 3、格雷码计数器 4、仿真验证 组合逻辑毛刺消除 信号在 IC/FPGA 器件中通过逻辑单元…

管理类联考——英语——翻译篇——新题型——经典方法论

第一节 英语(一)翻译 根据考试大纲&#xff0c;考研英语(一R翻译部分主要考查考生准确理解概念或结构较复杂的英语文字材料的能力。具体考查方式是要求考生阅读一篇约400词的文章&#xff0c;并将其中5个画线部分(约150词)译成汉语,要求译文准确、完整、通顺。 可以看出&#…

js数组高阶函数——filter()方法

js数组高阶函数——filter方法 filter&#xff08;&#xff09;方法⭐⭐⭐例1⭐⭐⭐例2⭐⭐⭐例3⭐⭐⭐例4⭐⭐⭐例5 filter&#xff08;&#xff09;方法 ⭐一般来说&#xff0c;filter() 方法用于过滤数组中的元素&#xff0c;并返回一个新数组。 语法&#xff1a; array.f…

Python多线程编程详解

概要 进程&#xff08;process&#xff09;指的是正在运行的程序的实例&#xff0c;当我们执行某个程序时&#xff0c;进程就被操作系统创建了。而线程&#xff08;thread&#xff09;则包含于进程之中&#xff0c;是操作系统能够进行运算调度的最小单元&#xff0c;多个线程可…

【AntDB数据库】AntDB数据库告警管理

告警历史 功能概述 数据库系统的主机、单节点集群的被监测指标达到告警阀值时&#xff0c;AMOPS就会产生告警并展示在告警分类页面上。 告警分类页面提供告警搜索查看功能&#xff0c;用户可以指定监控项、集群、事件级别、时间范围和告警对象对告警进行搜索。 查询的告警数…

Android12之执行adb disable-verity后android无法启动(一百五十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

AotucCrawler 快速爬取图片

AotucCrawler 快速爬取图片 今天介绍一款自动化爬取图片项目。 GitHub: GitHub - YoongiKim/AutoCrawler: Google, Naver multiprocess image web crawler (Selenium) Google, Naver multiprocess image web crawler (Selenium) 关键字 爬虫网站&#xff1a;Google、Naver &…