阿里云OSS 上传文件

2023-10-26

阿里云后台管理、API 集成教程、Key/ 域名的查询


1、查看上传的文件在哪?

a 、百度阿里云,进入官网。然后进入管理控制台



b、左侧菜单栏,进入对象存储 OSS 



c、进入 Bucket 管理页面,点击创建的bucket 名称



d、进入bucket 管理界面,点击左侧菜单

bucket属性 菜单查看bucket 域名

object 管理  查看管理上传的文件

图片处理   查看图片域名地址







2、查看accessKey  和 screctKey 




3、集成 OSS  sdk下载地址和API  地址

https://help.aliyun.com/document_detail/oss/sdk/android-sdk/preface.html?spm=5176.docoss/api-reference/abstract.6.302.9Lrnuz



Android 实现上传图片


1、下载sdk    https://help.aliyun.com/document_detail/oss/sdk/android-sdk/preface.html?spm=5176.docoss/sdk/android-sdk/get-start.6.302.WewVmT

  • 解压后得到 jar 包,目前包括 aliyun-oss-sdk-android-2.2.0.jar、okhttp-3.2.0.jar 和 okio-1.6.0.jar
  • 将以上 3 个 jar 包导入 libs 目录
2、在android manifest中增加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
3、初始化 OSS client 
可以建个 application  在 application中初始化,记得修改android manifest 中 application  name 
4、实现上传功能
代码:
application:
package com.tan.uploadtooss;

import com.alibaba.sdk.android.oss.ClientConfiguration;
import com.alibaba.sdk.android.oss.OSS;
import com.alibaba.sdk.android.oss.OSSClient;
import com.alibaba.sdk.android.oss.common.OSSLog;
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;
import android.app.Application;
import android.app.usage.NetworkStats.Bucket;

public class MainApplication extends Application {
	
	//OSS的Bucket
	public static final String OSS_BUCKET = Bucket名称;
	//设置OSS数据中心域名或者cname域名
	public static final String OSS_BUCKET_HOST_ID = 域名,不包含bucket;
	//Key
	private static final String accessKey = accessKey;
	private static final String screctKey = screctKey;
	
	public static OSS oss;
	@Override
	public void onCreate() {
		super.onCreate();
		//初始化OSS配置
		initOSSConfig();
	}
	
	private void initOSSConfig(){
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKey, screctKey);

        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
        conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
        conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
        conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
        if(BuildConfig.DEBUG){
        	OSSLog.enableLog();
        }
        oss = new OSSClient(getApplicationContext(), MainApplication.OSS_BUCKET_HOST_ID, credentialProvider, conf);
	}
	
	
}

activity:
package com.tan.uploadtooss;

import java.text.SimpleDateFormat;
import java.util.Date;
import com.alibaba.sdk.android.oss.ClientException;
import com.alibaba.sdk.android.oss.ServiceException;
import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
import com.alibaba.sdk.android.oss.callback.OSSProgressCallback;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private String mUploadFilePath = "/storage/emulated/0/DCIM/Camera/IMG_20150701_104558.jpg";
	private Button vCommit;
	
	protected Handler mHandler = new Handler();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		vCommit = (Button) findViewById(R.id.btn_commit);
		vCommit.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				uploadData( mUploadFilePath);
			}
		});
	}
	

	/**
	 * 上传图片
	 * @param imageByte
	 */
	private void uploadData(String uploadFilePath){
		mHandler.post(new Runnable() {
			@Override
			public void run() {
				//显示个等待页面
			}
		});
		
		PutObjectRequest put = new PutObjectRequest(MainApplication.OSS_BUCKET, "image/albums/"+getImageObjectKey("123456789"), uploadFilePath);
			
		put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
			@Override
			public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
				 Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
			}
		});
			
		MainApplication.oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
			@Override
			public void onSuccess(final PutObjectRequest request, PutObjectResult result) {
				Log.d("PutObject", "UploadSuccess");
	            Log.d("ETag", result.getETag());
	            Log.d("RequestId", result.getRequestId());
	            //将上传成功的图片地址传给自己的服务器后台,比如修改用户数据库中,用户头像的url。
	            //修改后台url成功后,再利用glide 下载最新的照片,修改本地头像图片。
	            //request.getObjectKey() 是图片地址,但是不包含,OSS 图片域名
//	            uploadImage(request.getObjectKey());
			}
				
			@Override
			public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
					mHandler.post(new Runnable() {
						@Override
						public void run() {
							//如果上传失败了,通过mHandler ,发出失败的消息到主线程中。处理异常。
//							showNetErrorInfo();
						}
					});
				       // 请求异常
	               if (clientExcepion != null) {
	                   // 本地异常如网络异常等
	                   clientExcepion.printStackTrace();
	               }
	               if (serviceException != null) {
	                    // 服务异常
	                   Log.e("ErrorCode", serviceException.getErrorCode());
	                   Log.e("RequestId", serviceException.getRequestId());
	                   Log.e("HostId", serviceException.getHostId());
	                   Log.e("RawMessage", serviceException.getRawMessage());
	               }
					
			}
		});
			
	}
	
	//通过UserCode 加上日期组装 OSS路径
	private String getImageObjectKey (String strUserCode){
		
    	Date date = new Date();
    	return new SimpleDateFormat("yyyy/M/d").format(date)+"/"+strUserCode+new SimpleDateFormat("yyyyMMddssSSS").format(date)+".jpg";
		    
	}
	
	
	
}
//将上传成功的图片地址传给自己的服务器后台,比如修改用户数据库中,用户头像的url。
//修改后台url成功后,再利用glide 下载最新的照片,修改本地头像图片。
//request.getObjectKey() 是图片地址,但是不包含,OSS 图片域名

实现代码:
/**
	 * 上传图片地址到接口后台
	 * @param string
	 */
	protected void uploadImage(final String faceImg) {
		String url = HttpHelper.HTTP_URL+HttpHelper.UserUrl.MODIFY_MEMBER;
		Map<String, String> map = new HashMap<String, String>();
		map.put("faceImg", faceImg);
		Map<String, String> params = new HashMap<String, String>();
		params = Utils.getParams(map, mContext);
		
		StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
			@Override
			public void onResponse(String response) {
				System.out.println("response:"+response);
				ParseDataHandler<BaseResponseData> parseDataHandler = new ParseDataHandler<BaseResponseData>(mHandler,response);
				parseDataHandler.setParseDataCallBack(new ParseDataCallBack<BaseResponseData>() {

					@Override
					public BaseResponseData executeParseData(String data) {
						BaseResponseData result = JsonUtil.toObject(data, BaseResponseData.class);
						return result;
					}

					@Override
					public void onResult(BaseResponseData t) {
						dimissMaterialLoadDialog();
						if(HttpHelper.HttpStatus.SUCCESS_CODE.equals(t.getCode())){
							showToast(R.string.label_upload_success);
//							ComeBackHomeReceiver.sendComeBackHome(mContext);
							Glide.with(mContext).load(HttpHelper.OSS_IMAGE_HOST+faceImg)
				            .centerCrop()
				            .placeholder(R.drawable.ic_me)
				            .error(R.drawable.ic_me)
				            .into(vRoundImg);
							System.out.println();
							mUserInfo.setFaceImg(HttpHelper.OSS_IMAGE_HOST+faceImg);
							mainApplication.getFinalDB().update(mUserInfo);
						}else{
							if(HttpHelper.HttpStatus.LOGIN_CONFICT_EXIT.equals(t.getCode())){
								mainApplication.clearDB();
								ShoppingCartNumChangeReceiver.sendCartNumChanged(mContext, 0);
								String msg = t.getMsg();
								if(!TextUtils.isEmpty(msg) && msg.trim().length() > 0){
									showToast(msg);
								}
								Intent intent = new Intent(mContext,HomeActivity.class);
								intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
								intent.putExtra("module", "Login");
								startActivity(intent);
							}
						}
					}
				});
				parseDataHandler.start();
			}
		}, new Response.ErrorListener() {
			@Override
			public void onErrorResponse(VolleyError error) {
				dimissMaterialLoadDialog();
				showNetErrorInfo();
			}
		});
		request.setHttpHeader(Utils.getHttpHeader(mContext,mUserInfo.getToken()));
		request.setParams(params);
		request.setTag(TAG);
		queue.add(request);
	}



manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tan.uploadtooss"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="23" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name="com.tan.uploadtooss.MainApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tan.uploadtooss.MainActivity" >

    <Button
        android:id="@+id/btn_commit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="上传" />

</RelativeLayout>

源码地址:
http://download.csdn.net/detail/legend12300/9488326


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里云OSS 上传文件 的相关文章

  • Ionic 3 Uncaught(承诺):[object Object]

    我是 Ionic 3 和移动开发的新手 我正在尝试将 MySQL DB 连接到我的 Ionic 应用程序和 PHP Restful API 我用 Postman 测试了 API 它工作得很好 为了在 Ionic 中实现它 我做了以下操作 我
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • 同步和异步 API

    我正在开发一个库 它提供一些耗时的服务 我需要每个 API 有两个版本 一个用于同步函数调用 另一个用于异步 图书馆用户应决定使用哪个版本 服务结果可能对于系统继续运行 同步调用 至关重要 可能需要在不同的工作线程中完成相同的操作 因为结果
  • GitHub v3 API - 如何在存储库中创建初始提交?

    我正在使用 v3 API 并设法列出存储库 树 分支 访问文件内容并创建 blob 树 提交 我现在正在尝试创建一个新的存储库 并设法使用 POST user repos 来完成它 但是当我尝试在这个新存储库中创建 blob trees c
  • 学院/大学数据 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试构建一个应用程序 允许用户查找特定大学并查看有关该大学的数据 录取率 SAT 分数 规模等 但
  • useState 由于某种原因没有更新?

    当我尝试使用 axios 从后端 API 获取一些数据 并在由于某种原因获得结果后设置状态时 状态不会更新 当我尝试使用状态时 它只会向我显示一个空数组 但有趣的是当我console log res data 它会毫无问题地向我显示我的列表
  • .NET Web API - 添加日志记录

    我正在寻找有关处理 API 日志记录的最佳方法的帮助 我想将所有请求和响应记录到 sql 或文本文件 如果这是最好的方法 目前我已经在 SQL Server 的日志表中插入一行 我使用名为 LogAction 的静态方法来执行此操作 并在
  • 如何按城市过滤 WikiVoyage API 结果?

    我目前正在尝试使用 wikivoyage API 我当前的 API 调用如下所示 en wikivoyage org w api php action query list search srwhat text srsearch Pari
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • 将 Django 模型映射到外部 API

    上下文 我有一个外部 API 提供数据并允许发布新数据或修补现有数据 API 响应示例 response requests get http api band 4 print response json id 4 name The Beat
  • 在react.js中调用API渲染数组图片

    我有 API 其中包括 pictures http storage web source images 2016 10 28 edac054f88fd16aee7bc144545fea4b2 jpg http storage web sou
  • 如何使用 Twitter Api 在单个请求中获取 20 多个列表成员?

    我想让超过 20 个用户在单个请求中使用 twitter api 有什么参数可以指定吗 我正在使用这个APIhttp api twitter com 1 Barelyme Politics members xml cursor 1 http
  • Swift:转义闭包捕获非转义参数“onCompletion”

    我的 swift 有问题 我正在尝试发送 API 请求 然后检索数据 但收到以下错误消息 Swift 转义闭包捕获非转义参数 onCompletion 有谁知道我该如何解决这个问题 提前致谢 Code class RestApiManage
  • 删除 Google Maps API Premier 使用条款/徽标/等。链接?

    删除我的集成谷歌地图 谷歌地图总理 上显示的徽标 使用条款链接是否合法 问题是 当我放大地图时 链接往往会变得更长并记录并覆盖整个网站 这非常难看 当然可以给div容器一个 overflow hidden 标志有一点帮助 但仍不令人满意 T
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • Codeception API 测试响应返回“N/A”

    我正在使用 Laravel 和 Codeception 作为测试框架编写 API 我无法让 Codeception 返回响应代码 我可以从 Codeception 获取响应代码 以及 JSON 响应 我编写了一个简单的测试来从 GET 请求
  • API Gateway POST 方法在测试期间工作,但不适用于邮递员

    我会尽力清楚地解释我的问题 我有一个 API 它使用 Node js 编写的 lambda 函数在 DynamoDB 中编写一些内容 当我在 AWS 控制台中调用它时 API 按预期工作 我发送这样的正文 user id 4dz545zd
  • 无法在 Angular 10 中的“pdf-viewer”=>“ng2-pdf-viewer”中显示 blob url

    我有一个 API 它将上传的文件作为 blob 返回 当我尝试绑定时src如果使用 blob URL 则它不会显示任何内容 但是 当我尝试绑定直接 URL 时 它可以显示 PDF 文件 这是我下面给出的代码 我的 TS 代码 downloa

随机推荐

  • 【图像分割】基于马尔可夫随机场实现图像分割附matlab代码

    1 简介 日常生活中 人们用图像进行信息的获取和交换 因此 图像处理的应用范 围一定涉及到人们的生活 工作和学习的各个方面 而随着社会的发展 人类活 动范围也随之扩大 随之变化的还有图像处理的应用范围 确切的说图像处理是 关于图像的获取 传
  • TencentOS-tiny 内核基础组件(二十)- 优先级队列

    一 内核基础组件 优先级队列 概述 提供了基于优先级的队列管理 环形队列的入队出队规则是先入队的先出队 first in first out 优先级队列的出队顺序是按照优先级来的 优先级较高的元素先出队 API讲解 编程实例 1 编写mai
  • ES&Elasticsearch-header--菜鸟教程03字段类型和属性

    一 基本数据类型 1 text 被全文搜索的字符串 字段内容会被分析 在生成倒排索引之前 字符串会分析器分成词项 该类型不用于排序 很少用于聚合 2 keyword 用于索引结构化的字段 例如 邮件地址 主机名 状态码和标签 不分词 只能精
  • PHP怎么发送邮件?

    当然可以使用第三方发送邮件服务 本文主要介绍使用语言自身功能 socket 结合 smtp协议 实现的方法 比较好用的封装好的发送邮件的类库 就是 PHPMailer 了 PHPMailer 项目地址 https github com PH
  • 批量拿web shell工具【最新】

    批量拿web shell工具 最新 内部有多个漏洞 可自动进行url采集 自动爬虫多个引擎和友情链接url 过狗一句话 轻松日出上千 详情可看 https note youdao com s G3zhC0Cw 命令执行 文件操作和sql注入
  • Linux 使用宝塔部署.NET6项目

    文章目录 前言 一 安装宝塔 二 配置 NET 环境 三 发布项目 四 安装nginx 五 设置守护进程 总结 前言 本文以CentOS为例讲解如何使用宝塔部署 NET项目 其中服务器系统与 NET 版本都是可以更换的 文中有指引链接 一
  • 数据库的种类

    数据库的种类大型数据库有 Oracle Sybase DB2 SQL server 小型数据库有 Access MySQL BD2等 2007年4月29日消息 国外媒体报道 据权威调研机构IDC初步数据显示 尽管微软SQL Server发展
  • MyBatis-Plus条件构造器queryWrapper、updateWrapper用法

    以QueryWrapper和UpdateWrapper为例 p 根据根据 entity 条件 删除记录 QueryWrapper实体对象封装操作类 可以为 null 下方获取到queryWrapper后删除的查询条件为name字段为null
  • c语言编写一个简单的答题系统

    利用c语言编写一个简单的答题系统 思路是先设计好题目和答案 再输入自己的答案 利用输入的答案与正确答案对比 从而得出你回答的对错 一 捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案 就像林小权和他的学号1234捆绑在一起一样 以
  • Jupyter Notebook

    Jupyter Notebook Jupyter Notebook是一个交互式笔记本 本质是一个 Web 应用程序 便于创建和共享文学化程序文档 支持实时代码 数学方程 可视化和 markdown 用途包括 数据清理和转换 数值模拟 统计建
  • 链游

    一 前言 身为一名从事移动互联网App开发多年的从业人员 一直在关注前沿的技术方向 以免被时代的列车遗落 从18年底开始关注DApp技术的发展 COCOS发起的COCOS BCX以区块链为底层技术 专注区块链游戏领域的DApp游戏开发框架自
  • nginx配置域名,不要端口

    在腾讯云上购买了域名 并在域名管理中 将域名指向了主机ip地址 tomcat中指定了端口8006未使用默认的8080 这样就可以使用域名 8006 项目名称访问网站 但是这样看起来也是泄露了端口号 去掉域名后面的端口号可以使用nginx实现
  • 【半监督学习】4、Dense Teacher

    文章目录 一 背景 二 方法 2 1 框架结构 2 2 伪标签的缺陷 2 3 Dense Peseudo Label 三 效果 3 1 数据和实验设置 3 2 主要的结果对比 3 3 和 SOTA 的对比 论文 Dense Teacher
  • 嵌入式学习--Linux文件系统结构(一)

    1 Linux文件系统结构 Linux文件系统就是一个树形的分层组织结构 就像一颗倒立的树 最顶层是根目录 2 常见目录说明 bin bin是二进制 binary 英文缩写 boot 存放的都是系统启动时要用到的程序 dev 包含了所有Li
  • 由浅到浅入门批量渲染(完)

    好久不见 这是第36篇与游戏开发有关的文章 上回简述了与优化骨骼蒙皮动画有关的内容 接下来我们将来到 由浅到浅 系列的最后一篇 介绍两种批量渲染骨骼蒙皮动画单位的优化方案 烘焙顶点动画和烘焙骨骼矩阵动画 简单来说 它们基本的思路 都是将骨骼
  • Python爬虫学习笔记(六)————BeautifulSoup(bs4)解析

    目录 1 bs4基本简介 1 BeautifulSoup简称 2 什么是BeatifulSoup 3 优缺点 2 bs4安装以及创建 1 安装 2 导入 3 创建对象 3 节点定位 1 根据标签名查找节点 2 函数 find 返回一个对象
  • C++可变参数函数

    什么是可变形参函数 在c 编程中 有时我们需要编写一些在源代码编写阶段无法确定参数个数 有时甚至无法确定参数类型的函数 例如 一个求和函数 可以通过重载实现若干个数的和 int sum int i1 int i2 int sum int i
  • 2023年全国职业院校技能大赛信息安全管理与评估网络安全渗透任务书

    全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透 理论技能与职业素养 比赛时间及注意事项 本阶段比赛时长为180分钟 时间为9 00 12 00 注意事项 1 通过找到正确的flag值来获取得分 fla
  • 爬虫到底是什么呢?爬虫有啥用途呢?

    爬虫技术 爬虫主要用于网络网页 又称网络爬虫和网络蜘蛛 可以自动浏览网络中的信息或一种网络机器人 它们广泛应用于互联网搜索引擎或其他类似的网站 以获取或更新这些网站的内容和检索方法 它们可以自动收集所有可访问的页面内容 以便程序进行下一步处
  • 阿里云OSS 上传文件

    阿里云后台管理 API 集成教程 Key 域名的查询 1 查看上传的文件在哪 a 百度阿里云 进入官网 然后进入管理控制台 b 左侧菜单栏 进入对象存储 OSS c 进入 Bucket 管理页面 点击创建的bucket 名称 d 进入buc