精华内容
下载资源
问答
  • OSS对象存储

    2017-11-12 16:45:00
    OSS对象存储 一、产品概述 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它具有与平台无关的RESTful API接口,能够提供99.99999999%的服务...

    OSS对象存储


    一、产品概述

       阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它具有与平台无关的RESTful API接口,能够提供99.99999999%的服务持久性。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。OSS适合各种网站、开发企业及开发者使用。

       您可以使用阿里云提供的API/SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准类型(Standard)的阿里云OSS服务作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问类型(Infrequent Access)和归档类型(Archive)的阿里云OSS服务作为不经常访问数据的备份和归档。

    二、产品优势

    OSS与自建存储对比的优势

    对比项对象存储OSS自建服务器存储
    可靠性- 服务可用性不低于99.9%。
    - 规模自动扩展,不影响对外服务。
    - 数据持久性不低于99.99999999%。 
    - 数据自动多重冗余备份。
    - 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。
    - 人工数据恢复困难、耗时、耗力。
    安全- 提供企业级多层次安全防护。
    - 多用户资源隔离机制,支持异地容灾机制。
    - 提供多种鉴权和授权机制及白名单、防盗链、主子账号功能。
    - 需要另外购买清洗和黑洞设备。
    - 需要单独实现安全机制。
    成本- 多线BGP骨干网络,无带宽限制,上行流量免费。
    - 无需运维人员与托管费用,0成本运维
    - 存储受硬盘容量限制,需人工扩容。 
    - 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。 
    - 需专人运维,成本高。
    数据处理能力- 提供图片处理、音视频转码、内容加速分发、鉴黄服务、归档服务等多种数据增值服务,并不断丰富中。- 需要额外采购,单独部署。

    OSS具备的其他各项优势

    方便、快捷的使用方式

        提供标准的RESTful API接口、丰富的SDK包、客户端工具、控制台。您可以像使用文件一样方便地上传、下载、检索、管理用于Web网站或者移动应用的海量数据。

    不限文件数量和大小。您可以根据所需存储量无限扩展存储空间,解决了传统硬件存储扩容问题。

    支持流式写入和读出。特别适合视频等大文件的边写边读业务场景。

    支持数据生命周期管理。您可以自定义将到期数据批量删除或者转入到低成本的归档服务。

    强大、灵活的安全机制

       灵活的鉴权,授权机制。提供STS和URL鉴权和授权机制,以及白名单、防盗链、主子账号功能。

    提供用户级别资源隔离机制和多集群同步机制(可选)。

    丰富、强大的增值服务

       图片处理:支持jpg、png、bmp、gif、webp、tiff等多种图片格式的转换,以及缩略图、剪裁、水印、缩放等多种操作。

      音视频转码:提供高质量、高速并行的音视频转码能力,让您的音视频文件轻松应对各种终端设备。

      内容加速分发:OSS作为源站,搭配CDN进行加速分发,具有稳定、无回源带宽限制、性价比高、一键配置的特点。

    三、创建存储空间

    提示:阿里云 OSS 中的所有文件都存储在存储空间(bucket)中。存储空间是您用来管理所存储文件的单元,所有对象都必须隶属于某个存储空间。您可以设置存储空间属性来控制地域、文件的访问控制、文件的生命周期等,这些属性都是作用在该存储空间下所有的文件上的,因此您可以灵活创建不同的存储空间来完成不同的管理功能。

    四、删除存储空间

    温馨提示:

       删除存储空间之前请确保其中存储的文件,包括尚未完成的分片上传文件产生的碎片文件全部清空,否则无法删除存储空间

    操作步骤:

    • 进入 OSS 管理控制台 界面。

    • 在左侧存储空间列表中,单击目标存储空间名称,然后单击页面右上角的 删除 按钮。

    • 在弹出的对话框中,单击 确定。

    五、修改存储空间的权限

    OSS 提供权限控制 ACL(Access Control List),您可以在创建存储空间的时候设置相应的 ACL 权限控制,也可以在创建之后修改 ACL。如果不设置 ACL,默认值为私有。

    OSS ACL 提供存储空间级别和文件级别的权限访问控制,目前有三种访问权限:

    • 私有:只有该存储空间的拥有者可以对该存储空间内的文件进行读写操作,其他人无法访问该存储空间内的文件。

    • 公共读:只有该存储空间的拥有者可以对该存储空间内的文件进行写操作,任何人(包括匿名访问者)可以对该存储空间中的文件进行读操作。

    • 公共读写:任何人(包括匿名访问者)都可以对该存储空间中的文件进行读写操作,所有这些操作产生的费用由该存储空间的拥有者承担,请慎用该权限。

    操作步骤:

    • 进入 OSS 管理控制台 界面。

    • 在左侧存储空间列表中,单击目标存储空间名称,打开该存储空间概览页面。

    • 单击 基础设置 页签,找到 读写权限 区域。

    • 单击管理,修改该存储空间的读写权限。

    • 单击 保存 。

    六、OOSFS挂载linux

        ossfs 能让您在Linux系统中把OSS bucket 挂载到本地文件系统中,您能够便捷地通过本地文件系统操作OSS 上的对象,实现数据的共享。

    主要功能

    ossfs 基于s3fs 构建,具有s3fs 的全部功能。主要功能包括:

    • 支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限,uid/gid,以及扩展属性(extended attributes)

    • 通过OSS 的multipart 功能上传大文件。

    • MD5 校验保证数据完整性。

    局限性

    ossfs提供的功能和性能和本地文件系统相比,具有一些局限性。具体包括:

    • 随机或者追加写文件会导致整个文件的重写。

    • 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。

    • 文件/文件夹的rename操作不是原子的。

    • 多个客户端挂载同一个OSS bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。

    • 不支持hard link。

    • 不适合用在高并发读/写的场景,这样会让系统的load升高。

    OS:centos 6.5

    安装:

    [root@xcn ~]# rpm -ivh http://docs-aliyun.cn-hangzhou.oss.aliyuninc.com/assets/attach/32196/cn_zh/1496671386629/ossfs_1.80.2_centos6.5_x86_64.rpm?spm=5176.doc32196.2.4.S73RyD&file=ossfs_1.80.2_centos6.5_x86_64.rpm

    将my-bucket这个bucket挂载到/mnt目录下,AccessKeyId是faint,AccessKeySecret是123,oss endpoint是http://oss-cn-hangzhou.aliyuncs.com

    echo my-bucket:faint:123 > /etc/passwd-ossfs

    chmod 640 /etc/passwd-ossfs

    mkdir /tmp/ossfs

    ossfs my-bucket /mnt -ourl=http://oss-cn-hangzhou.aliyuncs.com

    见证奇迹的时刻

    卸载挂载


    本文转自 baishuchao 51CTO博客,原文链接:http://blog.51cto.com/baishuchao/1958419


    展开全文
  • OSS 对象存储

    2021-06-16 14:44:04
    对象存储 OSS 海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。...

    对象存储 OSS

    海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。

    1600914642936

    入口:https://www.aliyun.com

    1600915424559

    1600915597153

    快速入门

    开始使用阿里云OSS

    阿里云对象存储OSS(Object Storage Service)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音视频在内的各种数据文件。

    初次使用阿里云OSS,请您先了解阿里云OSS常见问题阿里云OSS使用限制

    阿里云OSS将数据文件以对象(Object)的形式上传到存储空间(Bucket)中。您可以进行以下操作:

    • 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
    • 通过获取已上传文件的地址进行文件的分享和下载。
    • 通过修改存储空间或文件的读写权限(ACL)来设置访问权限。
    • 通过阿里云管理控制台、各种便捷工具以及丰富的SDK包执行基本和高级OSS操作。

    快速开始

    OSS的基本操作流程如下:

    quickstart

    1. 开通OSS服务
    2. 创建存储空间
    3. 上传对象
    4. 下载对象
    5. 删除文件
    6. 删除存储空间

    官方开发文档地址

    创建存储空间

    开通阿里云OSS服务后,您需要首先创建存储空间(Bucket)来存储文件。

    使用OSS管理控制台

    您可以根据以下步骤,使用OSS管理控制台创建存储空间。

    1. 登录OSS管理控制台

    2. 单击Bucket列表,之后单击创建Bucket。

      您也可以单击概览,之后单击右侧的创建Bucket。

    3. 在创建Bucket页面配置Bucket参数。

    具体参考: 官方开发文档

    1600917174586

    使用Java操作

    官方文档地址

    pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
        </dependency>
    
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>
    

    application.yml

    alioss:
      endpoint: oss-cn-hangzhou.aliyuncs.com
      accessKeyId: <AccessKeyId>
      accessKeySecret: <AccessKeySecret>
      bucketName: xinguan-parent
    

    OssEntity

    package com.xiaoge.system.entity.oss;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    /**
     * @author NieChangan
     */
    @ConfigurationProperties(prefix = "alioss")
    @Component
    @Data
    public class OssEntity {
    
        private String endpoint;
    
        private String accessKeyId;
    
        private String accessKeySecret;
    
        private String bucketName;
    }
    

    AliOssService

    package com.xiaoge.system.service;
    
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    
    /**
     * @author NieChangan
     */
    public interface AliOssService {
    
        /**
         * 创建存储空间
         */
        void createBucket();
    
        /**
         * 上传文件
         * @param file 文件对象
         * @return
         */
        String upload(MultipartFile file);
    
        /**
         * 下载文件
         * @throws IOException
         */
        void download(String fileName) throws IOException;
    
        /**
         * 列举文件
         */
        void listFile();
    
        /**
         * 删除文件
         */
        void deleteFile(String fileName);
    
    
    }
    

    AliOssServiceImpl

    package com.xiaoge.system.service.impl;
    
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.model.*;
    import com.xiaoge.system.entity.oss.OssEntity;
    import com.xiaoge.system.service.AliOssService;
    import org.joda.time.DateTime;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Date;
    import java.util.UUID;
    
    /**
     * @author NieChangan
     */
    @Service
    public class AliOssServiceImpl implements AliOssService, InitializingBean {
    
        @Autowired
        private OssEntity ossEntity;
    
        private String endpoint;
        private String accessKeyId;
        private String accessKeySecret;
        private String bucketName;
    
        @Override
        public void afterPropertiesSet() throws Exception {
             Endpoint以杭州为例,其它Region请按实际情况填写。
            endpoint = ossEntity.getEndpoint();
             阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
            accessKeyId = ossEntity.getAccessKeyId();
            accessKeySecret = ossEntity.getAccessKeySecret();
            bucketName = ossEntity.getBucketName();
        }
    
        @Override
        public void createBucket() {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            if (ossClient.doesBucketExist(bucketName)) {
                throw new RuntimeException(bucketName + "在对象存储的Bucket列表中已经存在");
            }
    
            // 创建存储空间。
            ossClient.createBucket(bucketName);
    
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    
        @Override
        public String upload(MultipartFile file) {
            //上传地址
            String uploadUrl = null;
    
            try {
                //判断oss实例是否存在:如果不存在则创建,如果存在则获取
                // 创建OSSClient实例。
                OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
                if (!ossClient.doesBucketExist(bucketName)) {
                    //创建bucket
                    ossClient.createBucket(bucketName);
                    //设置oss实例的访问权限:公共读
                    ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
                }
    
                //获取上传文件流
                InputStream inputStream = file.getInputStream();
    
                //构建日期路径:avatar/2020/07/31/文件名
                String datePath = new DateTime().toString("yyyy/MM/dd");
    
                //文件名:uuid.扩展名
                //获取上传文件的全名称
                String original = file.getOriginalFilename();
                //去掉uuid中生成的-
                String fileName = UUID.randomUUID().toString().replaceAll("-", "");
                //截取掉文件获得扩展名
                String fileType = original.substring(original.lastIndexOf("."));
                //uuid+.jpg/.png
                String newName = fileName + fileType;
                // yyyy/MM/dd+/uuid+.jpg/.png
                fileName = datePath + "/" + newName;
    
                //如果想要实现图片的预览效果,一定要设置一下几个点
                //1.设置文件 ACL为反正不能为私有  要么是公共读,要么是公共读写
                //2.一定要设置文本类型为(image/jpg)
                ObjectMetadata objectMetadata = new ObjectMetadata();
                //设置公共读权限
                objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
                //设置类型
                objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
    
                //文件上传至阿里云
                ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);
    
                // 关闭OSSClient。
                ossClient.shutdown();
    
                //默认十年不过期
                Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
                //bucket名称  文件名   过期时间
                uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
    
                //获取url地址
                //uploadUrl = "https://" + bucketName + "." + endPoint + "/" + fileName;
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return uploadUrl.substring(0, uploadUrl.indexOf("?"));
            //return uploadUrl;
        }
    
        @Override
        public void download(String fileName) throws IOException {
            // <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
            String objectName = fileName;
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            // 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
            // 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
            InputStream content = ossObject.getObjectContent();
            if (content != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                while (true) {
                    String line = reader.readLine();
                    if (line == null) {
                        break;
                    }
                    System.out.println("\n" + line);
                }
                // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                content.close();
            }
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    
        @Override
        public void listFile() {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            // ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
            ObjectListing objectListing = ossClient.listObjects(bucketName);
            // objectListing.getObjectSummaries获取所有文件的描述信息。
            for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                System.out.println(" - " + objectSummary.getKey() + "  " +
                        "(size = " + objectSummary.getSize() + ")");
            }
    
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    
        @Override
        public void deleteFile(String fileName) {
            // <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
            String objectName = fileName;
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            // 删除文件。
            ossClient.deleteObject(bucketName, objectName);
    
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    
        /**
         * Description: 判断OSS服务文件上传时文件的contentType
         *
         * @param FilenameExtension 文件后缀
         * @return String
         */
        public static String getcontentType(String FilenameExtension) {
            if (FilenameExtension.equalsIgnoreCase(".bmp")) {
                return "image/bmp";
            }
            if (FilenameExtension.equalsIgnoreCase(".gif")) {
                return "image/gif";
            }
            if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                    FilenameExtension.equalsIgnoreCase(".jpg") ||
                    FilenameExtension.equalsIgnoreCase(".png")) {
                return "image/jpg";
            }
            if (FilenameExtension.equalsIgnoreCase(".html")) {
                return "text/html";
            }
            if (FilenameExtension.equalsIgnoreCase(".txt")) {
                return "text/plain";
            }
            if (FilenameExtension.equalsIgnoreCase(".vsd")) {
                return "application/vnd.visio";
            }
            if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                    FilenameExtension.equalsIgnoreCase(".ppt")) {
                return "application/vnd.ms-powerpoint";
            }
            if (FilenameExtension.equalsIgnoreCase(".docx") ||
                    FilenameExtension.equalsIgnoreCase(".doc")) {
                return "application/msword";
            }
            if (FilenameExtension.equalsIgnoreCase(".xml")) {
                return "text/xml";
            }
            return "image/jpg";
        }
    }
    

    AliOssController

    package com.xiaoge.system.controller;
    
    import com.xiaoge.response.Result;
    import com.xiaoge.system.service.AliOssService;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * @author NieChangan
     */
    @Api
    @RestController
    @CrossOrigin
    public class AliOssController {
        @Autowired
        private AliOssService aliOssService;
    
        @ApiOperation(value = "上传图片文件")
        @PostMapping("/uploadImgFile")
        public Result uploadImgFile(MultipartFile file){
            String s = aliOssService.upload(file);
            return Result.ok().data("url",s);
        }
    
        @ApiOperation(value = "删除上传替换之后的头像")
        @PostMapping("/deleteImgFile")
        public Result deleteImgFile(String file){
            //https://xinguan-parent.oss-cn-hangzhou.aliyuncs.com/2020/09/25/1575345b2cd14c13872f9b83a0aac919.png
            try {
                String[] splitFile = file.split(".com/");
                aliOssService.deleteFile(splitFile[1]);
                return Result.ok();
            }catch (Exception e){
                return Result.error();
            }
        }
    }
    

    前端代码操作

    1601008423066

    1601008572021

    发送请求的代码

    export const deleteImgFile= (file) => {
      return request({
        url: "/deleteImgFile",
        method: 'post',
        params: {
          file
        }
      })
    }
    

    添加用户全部代码

    <template>
      <div>
        <el-dialog v-bind="$attrs" v-on="$listeners" :visible.sync="showDialog" @open="onOpen" @close="onClose" title="添加用户">
          <el-row :gutter="15">
            <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="80px">
              <el-col :span="24">
                <!-- 用户头像 -->
                <el-form-item label="用户头像">
    
                  <!-- 头衔缩略图 -->
                  <pan-thumb :image="image"/>
                  <!-- 文件上传按钮 -->
                  <el-button type="primary" icon="el-icon-upload" @click="imagecropperShow=true">更换头像
                  </el-button>
    
                  <!--
                    v-show:是否显示上传组件
                    :key:类似于id,如果一个页面多个图片上传控件,可以做区分
                    :url:后台上传的url地址
                    @close:关闭上传组件
                    @crop-upload-success:上传成功后的回调 -->
                  <image-cropper
                    v-show="imagecropperShow"
                    :width="300"
                    :height="300"
                    :key="imagecropperKey"
                    :url="'/uploadImgFile'"
                    field="file"
                    @close="closeImage"
                    @crop-upload-success="cropSuccess"/>
    
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="用户名" prop="username">
                  <el-input v-model="formData.username" placeholder="请输入用户名" clearable :style="{width: '100%'}">
                  </el-input>
                </el-form-item>
                <el-form-item label="昵称" prop="nickname">
                  <el-input v-model="formData.nickname" placeholder="请输入昵称" clearable :style="{width: '100%'}">
                  </el-input>
                </el-form-item>
                <el-form-item label="密码" prop="password">
                  <el-input v-model="formData.password" placeholder="请输入密码" clearable :style="{width: '100%'}">
                  </el-input>
                </el-form-item>
                <el-form-item label="手机" prop="phoneNumber">
                  <el-input v-model="formData.phoneNumber" placeholder="请输入手机" clearable :style="{width: '100%'}">
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="部门" prop="departmentId">
                  <el-select v-model="formData.departmentId" placeholder="请选择部门" clearable
                             :style="{width: '100%'}">
                    <el-option v-for="(item, index) in departments" :key="index" :label="item.name"
                               :value="item.id" :disabled="item.disabled"></el-option>
                  </el-select>
                </el-form-item>
                <el-form-item label="性别" prop="sex">
                  <el-radio-group v-model="formData.sex" size="medium">
                    <el-radio v-for="(item, index) in sexOptions" :key="index" :label="item.value"
                              :disabled="item.disabled">{{item.label}}</el-radio>
                  </el-radio-group>
                </el-form-item>
                <el-form-item label="邮箱" prop="email">
                  <el-input v-model="formData.email" placeholder="请输入邮箱" clearable :style="{width: '100%'}">
                  </el-input>
                </el-form-item>
                <el-form-item label="生日" prop="birth">
                  <el-date-picker v-model="formData.birth" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                                  :style="{width: '100%'}" placeholder="请选择生日" clearable></el-date-picker>
                </el-form-item>
              </el-col>
            </el-form>
          </el-row>
          <div slot="footer">
            <el-button @click="close">取消</el-button>
            <el-button type="primary" @click="handelConfirm">确定</el-button>
          </div>
        </el-dialog>
      </div>
    </template>
    <script>
      import ImageCropper from '../../components/ImageCropper'
      import PanThumb from '../../components/PanThumb'
      import { deleteImgFile } from '../../api/users'
    
      export default {
        name: 'UserAdd',
        components: {ImageCropper, PanThumb},
        // 接受父组件传递的值
        props:{
          addOrUpdateVisible:{
            type: Boolean,
            default: false
          },
          departments:{
            type: Array,
            default: []
          }
        },
        data() {
          return {
            formData: {
              field101: null,
              username: undefined,
              departmentId: undefined,
              nickname: undefined,
              sex: 1,
              password: undefined,
              email: undefined,
              phoneNumber: undefined,
              birth: "2020-09-09",
            },
            // 控制弹出框显示隐藏
            showDialog:false,
            imagecropperShow: false, // 是否显示上传组件
            imagecropperKey: 0, // 上传组件id
            image: 'https://wpimg.wallstcn.com/577965b9-bb9e-4e02-9f0c-095b41417191',
            rules: {
              username: [{
                required: true,
                message: '请输入用户名',
                trigger: 'blur'
              }],
              departmentId: [{
                required: true,
                message: '请选择部门',
                trigger: 'change'
              }],
              nickname: [{
                required: true,
                message: '请输入昵称',
                trigger: 'blur'
              }],
              sex: [{
                required: true,
                message: '性别不能为空',
                trigger: 'change'
              }],
              password: [{
                required: true,
                message: '请输入密码',
                trigger: 'blur'
              }],
              email: [{
                required: true,
                message: '请输入邮箱',
                trigger: 'blur'
              }],
              phoneNumber: [{
                required: true,
                message: '请输入手机',
                trigger: 'blur'
              }],
              birth: [{
                required: true,
                message: '请选择生日',
                trigger: 'change'
              }],
            },
            sexOptions: [{
              "label": "帅哥",
              "value": 1
            }, {
              "label": "美女",
              "value": 2
            }],
          }
        },
        computed: {},
        watch: {
          // 监听 addOrUpdateVisible 改变
          addOrUpdateVisible(oldVal,newVal){
            this.showDialog = this.addOrUpdateVisible
          },
        },
        created() {},
        mounted() {},
        methods: {
          onOpen() {
    
          },
          onClose() {
            this.$refs['elForm'].resetFields()
            this.$emit('changeShow', 'false')
          },
          close() {
            this.$emit('changeShow', 'false')
          },
          handelConfirm() {
            this.$refs['elForm'].validate(valid => {
              if (!valid) return
              console.log(this.formData)
            })
          },
          field101BeforeUpload(file) {
            let isRightSize = file.size / 1024 / 1024 < 2
            if (!isRightSize) {
              this.$message.error('文件大小超过 2MB')
            }
            let isAccept = new RegExp('image/*').test(file.type)
            if (!isAccept) {
              this.$message.error('应该选择image/*类型的文件')
            }
            return isRightSize && isAccept
          },
          // 上传成功后的回调函数
          cropSuccess(data) {
            console.log(data)
            var oldImage = this.image;
            this.imagecropperShow = false
            this.image = data.data.url;
            // 上传成功后,重新打开上传组件时初始化组件,否则显示上一次的上传结果
            this.imagecropperKey = this.imagecropperKey + 1
            //上传成功之后删除之前的头像
            this.deleteAvatar(oldImage);
          },
          // 关闭上传组件
          closeImage() {
            this.imagecropperShow = false
            // 上传失败后,重新打开上传组件时初始化组件,否则显示上一次的上传结果
            this.imagecropperKey = this.imagecropperKey + 1
          },
          //删除上传之前的图片
          async deleteAvatar(oldImage){
            const {data} = await deleteImgFile(oldImage)
          }
        }
      }
    
    </script>
    <style>
      .el-upload__tip {
        line-height: 1.2;
      }
    </style>
    
    展开全文
  • oss对象存储

    千次阅读 2016-11-13 13:01:11
    含义:对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全和高可靠的云存储服务。RESTful API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。 对象存储 ...

    含义:对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全和高可靠的云存储服务。RESTful API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。

    对象存储 OSS,可以理解为一个即开即用,无限大空间的存储集群。相比传统自建服务器存储,它有着诸多优势

    对象存储 OSS     自建服务器存储对比
    可靠性
        服务可用性不低于99.9%。
    规模自动扩展,不影响对外服务;
    数据持久性不低于99.99999999%。数据自动多重冗余备份     受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。
    人工数据恢复困难、耗时、耗力。
    安全
        提供企业级多层次安全防护,多用户资源隔离机制;支持跨区域复制、异地容灾机制
    提供多种鉴权和授权机制及白名单、防盗链、主子账号功能     清洗和黑洞设备需要另外购买,价格昂贵
    安全机制需要单独实现,开发和维护成本高
    成本
        高性价比最低只需要0.14/GB/月
    多线BGP骨干网络,无带宽限制,上行流量免费
    无需运维人员与托管费用,0成本运维     一次性投入高,资源利用率很低
    存储受硬盘容量限制,需人工扩容
    单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容
    需专人运维,成本高
    数据处理能力
        提供图片处理、音视频转码、内容加速分发、鉴黄服务、归档服务等多种数据增值服务,并不断丰富中     需要额外采购,单独部署
    众多客户信任并使用阿里云的对象存储服务:

      使用     
    方便、灵活的使用方式,让您像操作本地文件一样

        提供标准的RESTful API接口,丰富的SDK包,客户端工具、控制台,您可以像使用文件一样,方便上传/下载、检索、管理用于Web网站或者移动应用海量的数据。 了解详情>>
        支持流式写入和读出,特别适合视频等大文件的边写边读业务场景。 了解追加上传方式详情>>
        支持数据生命周期管理,您可以方便自定义到期数据转入低成本的归档服务或者批量删除。 了解详情>>

    流式写入和读取,支持边读边写

        尤其适用视频监控存储、提供类文件读写接口,使摄像机的视频码流能像“流”一样往对象(文件)后面追加新内容,且已上传的内容即使在该对象(文件)未写完时都可以被访问,真正实现文件流式存储,视频录像秒级回放 了解详情>>
        提供设备端直连OSS的C语言SDK开发包和Demo。加快您的开发速度,节省开发成本 下载解决方案SDK>>

    安全     
    强大、灵活的安全机制

        灵活的鉴权,授权机制。提供STS和URL鉴权和授权机制,及白名单,防盗链,主子账号功能;了解详情>>
        提供跨区域复制功能,实现数据异地容灾。了解详情>>

    增值服务     
    强大的数据处理能力,协助您对存储在OSS上的文件进行加工处理

        图片处理:支持jpg, png, bmp, gif, webp, tiff等多种图片格式的文件格式转换、缩略图、剪裁、水印、缩放等多种操作。 了解详情>>
        音视频转码:基于OSS存储,为您提供高质量,高速并行音视频转码能力,让您的音视频文件轻松应对各种终端设备。 了解详情>>
        内容加速分发:OSS作为源站,搭配CDN进行加速分发,稳定、无回源带宽限制、性价比高,一键配置。 了解详情>>

    生态     
    不断丰富的行业解决方案产品包

        安防监控行业,在线点播,交互式直播,图片处理与存储等了解详情>>

    对象存储OSS 典型应用场景

        网站/应用动静分离
        海量文件存储
        云端数据处理
        数据下载加速
        跨区域容灾

        您可以像文件夹一样管理您网站上的图片,脚本,视频等静态资源,通过BGP网络或者CDN加速的方式,提供用户就近访问,有效降低云服务器负载,提升用户体验。
        建议搭配 : 对象存储 OSS + 云服务器ECS+CDN

            了解动静分离架构详情 >>



    展开全文
  • OSSClient client = new OSSClient(endpoint, accessId, accessKey); long expireTime = 30; long expireEndTime = System.currentTimeMillis() + expireTime * 1000; Date expiration = new Date...
  • 七牛云OSS对象存储上传文件
  • 实现阿里OSS对象存储

    2018-07-11 14:11:28
    实现阿里云OSS对象存储完整代码全网唯一;具体里面有说明文件,说明文件中还说明了其它技术;
  • springboot集成oss对象存储服务

    千次阅读 2021-04-18 16:59:30
    springboot集成oss对象存储服务 1. 环境准备: 登录阿里云oss对象存储控制台:传送门 前提环境搭建请参考阿里云oss对象存储官方文档:传送门 2.创建springboot项目导入 oss相关依赖 <!--OSS图片服务器 --> <...

    springboot集成oss对象存储服务

    • 小白一枚 如若描述有误还请评论区指点痛批

    1. 环境准备:
    登录阿里云oss对象存储控制台:传送门
    前提环境搭建请参考阿里云oss对象存储官方文档:传送门
    2.创建springboot项目导入 oss相关依赖

    <!--OSS图片服务器  -->
    <dependency>
    	<groupId>com.aliyun.oss</groupId>
    	<artifactId>aliyun-sdk-oss</artifactId>
    	<version>3.10.2</version>
    </dependency>
    

    请根据当前版本状况进行调整(博主测试时间:2021/4/18有效)
    3.创建application.properties文件并配置

    application.properties配置项:

    # EndPoint
    aliyun.oss.file.endpoint=xxxxxxxxxxxxxxxx
    # KeyId
    aliyun.oss.file.keyid=xxxxxxxxxxxxxxxxxx
    # KeySecret
    aliyun.oss.file.keysecret=xxxxxxxxxxxxxxxxxxxxxx
    # bucketName
    aliyun.oss.file.bucketname=xxxxxxxxxxxxxxxxxx
    # # 访问图片的固定前缀
    aliyun.oss.file.httpsprefix=xxxxxxxxxxxxxx
    

    如上五个配置如果找不到请看下图:
    EndPoint
    在这里插入图片描述
    KeyId和 KeySecret
    在这里插入图片描述
    bucketName
    在这里插入图片描述
    访问图片的固定前缀
    在这里插入图片描述

    只要相关依赖存在以下代码均可直接copy

    3.创建工具类

    package com.oss;
    
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class OssConstant implements InitializingBean {
        /** 从配置文件中读取bucketName */
        @Value("${aliyun.oss.file.bucketname}")
        private String bucketName;
        /** 从配置文件中读取存储文件的地址前缀 */
        @Value("${aliyun.oss.file.httpsprefix}")
        private String ossHttpsPrefix;
     
        public static String BUCKET_NAME;
        public static String OSS_HTTPS_PREFIX;
     
        @Override
        public void afterPropertiesSet() throws Exception {
            BUCKET_NAME = bucketName;
            OSS_HTTPS_PREFIX = ossHttpsPrefix;
        }
     
    }
    

    4.创建配置类

    package com.oss;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.OSSClientBuilder;
    
    @Configuration
    public class OssConfig {
        /** 从配置文件中读取endPoint */
        @Value("${aliyun.oss.file.endpoint}")
        private String ossEndpoint;
        /** 从配置文件中读取KeyId */
        @Value("${aliyun.oss.file.keyid}")
        private String keyId;
        /** 从配置文件中读取KeySecret */
        @Value("${aliyun.oss.file.keysecret}")
        private String keySecret;
     
        @Bean
        public OSSClient ossClient(){
            return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);
        }
    }
    
    

    5.创建Controller

    package com.oss;
    
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.UUID;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    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;
    
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.DeleteObjectsRequest;
    import com.aliyun.oss.model.DeleteObjectsResult;
    
    @RestController
    @RequestMapping("/oss")
    public class OssController {
        @Autowired
        private OSSClient ossClient;
     
        /**
         * 上传图片到OSS
         * @param file 图片文件
         * @return 图片访问地址
         */
        @PostMapping("/upload")
        public String ossUpload(MultipartFile file){
        	System.out.println("文件上传"+file);
            // 获取原始文件名(我一般都是用UUID生成新的文件名)
            String fileName = file.getOriginalFilename();
            // 文件夹名(可以用模块名)
            String folder = "liuchengyin";
            // 文件夹名(根据日期来存储)
            String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            // 文件名 - 使用UUID生成
            String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");
            if (fileName != null){
                // 获取原始文件名的后缀,如.jpg .png
                fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));
            } else {
                // 一般来说这种情况是不存在的
                fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";
            }
            try {
                ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)
            // 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作
            return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;
        }
     
        /**
         * 删除OSS里的文件/文件夹(文件夹内不能有文件)
         * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
         * @return
         */
        @PostMapping("/delete")
        public String ossDelete(String fileName){
            ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
            return "删除成功!";
        }
     
        /**
         * 批量删除OSS里的文件
         * @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
         * @return
         */
        @PostMapping("/deleteBatch")
        public List<String> ossDeleteBatch(@RequestBody List<String> fileNames){
            DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
            // 返回的就是删除成功的图片名集合(图片不存在,也会返回)
            return deleteObjectsResult.getDeletedObjects();
        }
     
        /**
         * 查询OSS里的文件是否存在
         * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
         * @return 是否存在:true or false
         */
        @GetMapping("/exist")
        public Boolean isExist(String fileName) {
            return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
        }
    }
    
    

    更多需求可以参考阿里云 oss官方api:传送门

    拿到图片访问url后如果不能访问请设置如下:
    在这里插入图片描述
    访问链接为: https:// 拿到的链接
    举例:https://xiaoou1.oss-cn-beijing.aliyuncs.com/liuchengyin/2021-04-18/bd95d88734af43b0b90e5879fe451bf4.jpg
    注释:根据oss文档规定通过文件URL访问图片时,默认是下载行为,因为博主很穷只有一个域名 所以暂时没有绑定 所以您在访问时默认是下载图片的行为而不是在线预览 如果你有html基础你可以使用img标签来展示图片
    注释:
    这里详情请看官方文档

    访问控制(Resource Access Management,RAM)是阿里云提供的一项管理用户身份与资源访问权限的服务。使用
    RAM,您可以创建、管理 RAM 子用户(例如员工、系统或应用程序),并可以控制这些 RAM
    子用户对资源的操作权限。当您的企业存在多用户协同操作资源时,使用 RAM
    可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低企业信息安全风险。 了解 访问控制 RAM 产品。

    博主之前填写的是阿里云 API 的密钥 但是官方是非常建议大家填写子用户的密钥
    在这里插入图片描述
    传送门:RAM访问控制台
    创建用户并为用户赋予权限
    此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
    此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
    此时注意注意注意 !!!!!!!!!!!!!!!!!!!!
    使用子用户的KeyId和KeySecret要注意当你创建完成后它会提示你在你创建的时候显示一次之后不做显示 而此时你就要妥善保管如果丢失则重新创建一次

    展开全文
  • 阿里云对象存储OSS计费模式分为按量计费和包年包月,对象存储OSS的计费项有很多,不仅包括存储费用,还包括流量费用、请求费用、据处理费、标签费用及传输加速费用,新手站长网来详细说下阿里云对象存储OSS不同计费...
  • 阿里云OSS对象存储搭建网盘教程

    千次阅读 2020-08-28 09:52:12
    阿里云OSS对象存储高可靠数据存储服务,使用OSS对象存储搭建个人网盘或企业网盘,存储可靠性高下载不限速,当然阿里云推出了自家的网盘,码笔记分享使用OSS对象存储搭建个人网盘或企业网盘的方法: 使用OSS对象存储...
  • 阿里云OSS对象存储

    2021-06-20 09:03:22
    阿里云OSS对象存储开通“对象存储OSS”服务创建Bucket上传测试图片获取用户acesskeys使用SDK文档pom创建存储空间以文件流上传文件服务实现搭建server-oss模块pomapplication.yml启动类配置网关测试SDK封装service...
  • 创建阿里云OSS对象存储服务 创建bucket存储空间 创建RAM子用户Accesskey进行API调用(安全性考虑) 添加权限: 代码有关操作 引入阿里云oss依赖 <!-- 使用阿里云的oss对象存储服务--> <...
  • 应用OSS对象存储提供文件存储服务 - OSS SDK的安装 1.SDK相关信息 OSS Java SDK适用于JDK 6及以上版本。 2.SDK安装 maven代码 &lt;dependency&gt; &lt;groupId&gt;com.aliyun.oss&lt;...
  • 阿里云OSS对象存储创建Bucket时可以选择是否开通版本控制功能,什么是OSS版本控制功能?OSS对象存储有必要开通版本控制吗?开通版本控制需要另外付费吗?不懂云来详细说下OSS版本控制功能详细说明及收费价格: ...
  • 阿里云oss对象存储上传管理工具 oss-browser-darwin-x64.zip Mac版本
  • 主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • OSS对象存储之阿里云和七牛云

    千次阅读 2019-09-25 16:08:48
    说一下我常用的两个对象存储,一个阿里的,另一个是七牛云的。 阿里云对象存储是收费的,账单费用是由四个部分组成的: ...下面来介绍一下到底什么是OSS对象存储OSS对象存储视频简介 (奈何CSDN的markdown...
  • 阿里云OSS对象存储简介简单的使用开发准备具体应用 简介 官方简介: 海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性。使用RESTful API 可以在互联网任何位置存储和访问,容量和...
  • 阿里云OSS对象存储阿里云OSS对象存储参考优秀博文oss上传三种方式第一种第二种 阿里云OSS对象存储 参考优秀博文 https://www.cnblogs.com/dalaoyang/p/10885424.html ... 上传数据信息到oss服务器有三种方式 ...
  • 官网文档 ...登录阿里云官网: 搜索RAM->进入RAM 访问控制。 创建用户: ...记录你的 AccessKey ID和AccessKey Secret信息: ...去官网登录阿里云,开通oss对象存储 创建Bucket: 信息确认无误后,
  • 前因 温馨提醒:阅读本文需要5分钟 半藏商城刚开始的商品图片上传都是存储到服务器的一个路径中的,但是在开发过程中是windos系统...首先需要在阿里云控制台开通阿里云OSS对象存储服务,可以购买半年套餐(不贵),然
  • 阿里OSS对象存储的简单使用

    千次阅读 2017-08-05 12:44:49
    关于阿里OSS对象存储的简单使用。当项目中资源过大时可以使用。
  • 阿里云oss对象存储上传管理工具 oss-browser-linux-x64.zip Windows X64位版本
  • PHP一键上传图片到阿里云OSS对象存储,自己编写的代码,有一些注释。已在本地测试,运行成功。注意:1.有阿里云的对象存储;2.要获取AccessKey及找准Endpoint,修改代码中相应的部分;3.点击即上传,只支持图片格式...
  • 阿里云 OSS 对象存储实际开发需先阅读 阿里云 [OSS快速入门文档](https://help.aliyun.com/document_detail/31883.html?spm=5176.208357.1107607.14.7f06390fo9yUNT)开通服务无实际操作难度,PASS创建存储空间获取 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,311
精华内容 7,324
关键字:

oss对象存储