• 关于 文件--文件对象的方法 的搜索结果

问题

多线程知识点

蛮大人123 2019-12-01 19:47:56 1113 浏览量 回答数 1

回答

存储在OSS上的文件,如何设置防盗链功能? 为了防止用户在OSS上的数据被其他人盗链,OSS支持基于HTTP header中表头字段referer的防盗链方法。 目前,只有通过OSS的控制台( http://i.aliyun.com/dashboard/instance?type=oss)可以对一个bucket设置referer字段的白名单和是否允许referer字段为空的请求访问。    例如,对于一个名为mydata的bucket,设置其referer白名单为 http://www.aliyun.com。则所有referer为 http://www.aliyun.com的请求才能访问mydata这个bucket中的Object。    细节分析: 1) 用户只有通过 URL 签名或者匿名访问 Object 时,才会做防盗链验证。请求的 Header 中有“Authorization”字段的,不会做防盗链验证。 2) 一个 bucket 可以支持多个 referer 参数,这些参数之间由“,”号分隔。 3) Referer 参数支持通配符“*”和“?”。 4) 用户可以设置是否允许 referer 字段为空的请求访问。 5) 白名单为空时,不会检查 referer 字段是否为空(不然所有的请求都会被拒绝)。 6) 白名单不为空,且设置了不允许 referer 字段为空的规则;则只有 referer 属于白名单的请求被允许,其他请求(包括 referer 为空的请求)会被拒绝。 7) 如果白名单不为空,但设置了允许 referer 字段为空的规则;则 referer 为空的请求和符合白名单的请求会被允许;其他请求都会被拒绝。 8) Bucket 的三种权限(private,public-read,public-read-write)都会检查 referer字段。       星号“*”: 可以使用星号代替0个或多个字符。如果正在查找以AEW开头的一个文件,但不记得文件名其余部分,可以输入AEW*,查找以AEW开头的所有文件类型的文件,如AEWT.txt、AEWU.EXE、AEWI.dll等。要缩小范围可以输入AEW*.txt,查找以AEW开头的所有文件类型并.txt为扩展名的文件如AEWIP.txt、AEWDF.txt。 问号“?”: 可以使用问号代替一个字符。如果输入love?,查找以love开头的一个字符结尾文件类型的文件,如lovey、lovei等。要缩小范围可以输入love?.doc,查找以love开头的一个字符结尾文件类型并.doc为扩展名的文件如lovey.doc、loveh.doc。    不允许Refer为空 可能有些人搞不明白,简单说就是直接在浏览器中输入图片URL,refer为空;从网页中点击打开图片则refer不为空。    注:资料参考API文档地址 http://help.aliyun.com/manual?&helpId=253        细节分析参考资料 http://www.amznz.com/aliyun-oss-referer/ ------------------------- 11.云服务器与OSS 上传文件,流量与请求次数是否收费? 云服务器与OSS之间通过内网地址上传或下载数据,属内网流量,是免费的。 阿里云服务器与OSS之间的内网访问通信地址为: http://oss-internal.aliyuncs.com (需用以上方式进行访问,方可计为内网流量) *  可通过cname方式或三级域名的方式访问文件 云服务器与OSS每次请求所产生的请求次数,不分内外网都会计费。 收费详情请参考 http://www.aliyun.com/product?type=oss#price 12.OSS API返回结果没有JSON格式的吗? 只有XML格式 13. 如何进行大文件上传? 1、有开发能力的用户:可以通过oss API或SDK来操作。 • 5GB以下文件或网络速度好的用户,可以使用PUT object 。 • 5GB以上或网络速度不好并且文件在100M以上的用户推荐使用 Multipart Upload 2、无开发基础客户可下载OSS客户端,请参考 http://bbs.aliyun.com/read.php?tid=95321 14.object怎么改名? 两种方法可以实现:1. 您可以删除原来的文件,上传新命名的文件也能达到改名的效果2. 您可以通过copy objcet 源文件复制成为一个新名字的文件。再把源文件删除即可 15.OSS中可以重命名bucket吗?是否支持object迁移? OSS的bucket暂不支持重命名,若需要其他名称建议您重新创建bucket。 OSS 提供了COPY objcet的功能,您可以将原bucekt下的文件COPY到新bucket即可。 16.咨询一下java sdk中的 ossclient对象是否是线程安全的? java sdk中的 ossclient对象是线程安全的 17.测试版PHP SDK中不能自动检测所需PHP模块,是什么原因? 1.使用phpinfo来查看PHP模块。使用PHPSDK需要配置CURL功能模。具体安装CURL的方法可参考: http://bbs.aliyun.com/read.php?tid=18967 ; 2.您可以下载最新的PHP SDK包。已支持自动检测所需PHP模块 http://www.aliyun.com/product?type=oss#resources 18.比如多个文件object, 直接指定多个object,生成一个url,打包一起下载? 目前oss不支持多个object打包下载。 此需求可以由上层应用逻辑进行处理。OSS服务提供平台级基础资源的存储支持。 19.OSS返回的文件网络路径,域名都是aliyun的吗? 是的。支持CNAME 同时现在支持绑定自己的域名 20.可以给出一个java实现生成url签名的代码示例吗? 生成签名以后的URL的示例代码如下: // Generate a presigned URL Date expires = new Date (new Date().getTime()   1000 * 60); // 1 minute to expire GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key); generatePresignedUrlRequest.setExpiration(expires); URL url = client.generatePresignedUrl(generatePresignedUrlRequest); System.out.println(url.toString()); 这段代码假定指定bucketName和key的Object已经上传到OSS,用户可以根据修改设定expires,即过期时间。更详细的操作可以参考OSSClient#generatePresignedUrl方法和GeneratePresignedUrlRequest类的帮助。 ------------------------- 21.OSS中url中可以实现授权文件上传吗? Oss中url中授权文件上传可以实现 java版代码示例如下:GeneratePresignedUrlRequest generatePresignedUrlRequest = 1)url中包含签名的好像能够实现文件的下载,阿里云能实现url中授权文件上传吗? new GeneratePresignedUrlRequest(bucketName, key); 2)java版代码示例如下: generatePresignedUrlRequest.setMethod(HttpMethod.PUT); generatePresignedUrlRequest.setExpiration(expires); generatePresignedUrlRequest.addUserMetadata("usermeta", "uservalue"); // If you need to set user metadata URL url = client.generatePresignedUrl(generatePresignedUrlRequest); 22.如何使用JAVA SDK源代码? 您可以使用jd decompiler等Java反编译的工具打开SDK的jar文件,即可以查看全部源代码。 23.为什么bucket下的文件都删除了,却还能查看到占用的空间,并且bucket也删除不了? 请确认您是否使用过UploadMultipart 的功能,如使用过,建议您可以通过UploadsList Multipart 查看是否存在已经被初始化但是未被Complete或者Abort的 Multipart Upload的part。如果有,则需再执行Abort Multipart Upload(来终止上次操作的 Multipart Upload,该命令会自动删除未完成的part)。 因为未完成合并的part,无法形成objcet, 所以通过object list是看不到这些残留的part 但这些都会产生占用空间量。 24.如何使用内网 ? 阿里云云服务器与OSS之间通过Bucket.oss-internal.aliyuncs.com(OSS内网请求域名)的方式请求,所产生的网络流量可享受内网流量免费。 25.无法上传大文件怎么办? 无法向OSS上传大文件。上传1KB以下的文件就可以,2KB以上的文件就不成功,请求发出去就收不到任何响应,直至超时。 解决办法是将本机的MTU设成1470(默认应该是1500) Linux下修改MTU的命令是:(以阿里云服务器oss走内网默认是eth0为例) ip link set dev eth0 mtu 1470 26.OSS支持bucket作为三级域名的访问方式? 三级域名外链访问: http://bucketname.oss.aliyuncs.com/object 例如: http://cloudstorage.oss.aliyuncs.com/pujing.jpg 普通外链访问: http://oss.aliyuncs.com/bucketname/object 例如: http://oss.aliyuncs.com/cloudstorage/pujing.jpg 温馨提示:如果你的bucket里面有下划线"_",那么由于不符合WWW规范,所以无法做为三级域名使用,只能使用普通外链访问方式。 ------------------------- 终于整理出来了 。。。。大半夜的 闹鬼啊 ------------------------- 回 6楼(kashi) 的帖子 谢谢支持 ------------------------- 回 5楼(yyd521) 的帖子 只要能帮到大家   应该的拉 ------------------------- Re:ReOSS官方帮助文档在此归类发布,常见问题基本能在这里找到答案。 引用第10楼pasahu于2013-07-20 20:53发表的 ReOSS官方帮助文档在此归类发布,常见问题基本能在这里找到答案。 : 快点吧 discuz  x2.5  3.0整出来吧。。搞些实在的。 你好  这个我们在做  很快  插件就出来了 ------------------------- 感谢夸奖

asky8 2019-12-02 01:36:19 0 浏览量 回答数 0

回答

Re轻云服务器无法从本地上传bak备份文件恢复数据库! 官方没人答复吗? ------------------------- 回2楼dengcf的帖子 但是我按照你的方法。在用mssql2008 生成脚本时报错 提示“数据库qds163264291中 没有对象属于此向导可以编写脚本的类型,头疼死了,2天了。没法导入bak备份无法恢复数据库!!请帮忙啊!

小飞鱼2016 2019-12-02 02:25:57 0 浏览量 回答数 0

消息队列 RocketMQ 9.9元包月起

消息队列 RocketMQ 9.9元包月起,另含2000万次API 免费调用额度

问题

CDN 如何实现设置HTTP头?

青衫无名 2019-12-01 22:02:12 2245 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 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升高。 安装及使用 安装包下载 Linux发行版 下载 Ubuntu 16.04 (x64) ossfs_1.80.5_ubuntu16.04_amd64.deb Ubuntu 14.04 (x64) ossfs_1.80.5_ubuntu14.04_amd64.deb CentOS 7.0 (x64) ossfs_1.80.5_centos7.0_x86_64.rpm CentOS 6.5 (x64) ossfs_1.80.5_centos6.5_x86_64.rpm 由于低版本的Linux发行版本内核版本比较低,ossfs进程在运行过程中容易出现掉线或者其他问题,因此建议用户将操作系统升级到CentOS 7.0或者Ubuntu 14.04以及以上版本。 安装方法 对于Ubuntu,安装命令为:sudo apt-get update sudo apt-get install gdebi-core sudo gdebi your_ossfs_package 对于CentOS6.5及以上,安装命令为:sudo yum localinstall your_ossfs_package 对于CentOS5,安装命令为:sudo yum localinstall your_ossfs_package --nogpgcheck 使用方法 设置bucket name 和 AccessKeyId/Secret信息,将其存放在/etc/passwd-ossfs 文件中,注意这个文件的权限必须正确设置,建议设为640。 echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs 将OSS bucket mount到指定目录。 ossfs my-bucket my-mount-point -ourl=my-oss-endpoint 示例 将my-bucket这个bucket挂载到/tmp/ossfs目录下,AccessKeyId是faint,AccessKeySecret是123,oss endpoint是http://oss-cn-hangzhou.aliyuncs.comecho my-bucket:faint:123 > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs mkdir /tmp/ossfs ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou.aliyuncs.com 注意 如果您使用在阿里云购买的云虚拟机主机(ECS)来提供ossfs服务, 您可以使用内网域名,比如在这个例子您可以将oss endpoint 改成oss-cn-hangzhou-internal.aliyuncs.com,这样可以节省带宽方面的费用。OSS的内网域名请参考访问域名和数据中心。 卸载bucketfusermount -u /tmp/ossfs更多详细内容请参考:GitHub ossfs 版本日志 请参考:GitHub ChangeLog

2019-12-01 23:15:14 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 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升高。 安装及使用 安装包下载 Linux发行版 下载 Ubuntu 16.04 (x64) ossfs_1.80.5_ubuntu16.04_amd64.deb Ubuntu 14.04 (x64) ossfs_1.80.5_ubuntu14.04_amd64.deb CentOS 7.0 (x64) ossfs_1.80.5_centos7.0_x86_64.rpm CentOS 6.5 (x64) ossfs_1.80.5_centos6.5_x86_64.rpm 由于低版本的Linux发行版本内核版本比较低,ossfs进程在运行过程中容易出现掉线或者其他问题,因此建议用户将操作系统升级到CentOS 7.0或者Ubuntu 14.04以及以上版本。 安装方法 对于Ubuntu,安装命令为:sudo apt-get update sudo apt-get install gdebi-core sudo gdebi your_ossfs_package 对于CentOS6.5及以上,安装命令为:sudo yum localinstall your_ossfs_package 对于CentOS5,安装命令为:sudo yum localinstall your_ossfs_package --nogpgcheck 使用方法 设置bucket name 和 AccessKeyId/Secret信息,将其存放在/etc/passwd-ossfs 文件中,注意这个文件的权限必须正确设置,建议设为640。 echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs 将OSS bucket mount到指定目录。 ossfs my-bucket my-mount-point -ourl=my-oss-endpoint 示例 将my-bucket这个bucket挂载到/tmp/ossfs目录下,AccessKeyId是faint,AccessKeySecret是123,oss endpoint是http://oss-cn-hangzhou.aliyuncs.comecho my-bucket:faint:123 > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs mkdir /tmp/ossfs ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou.aliyuncs.com 注意 如果您使用在阿里云购买的云虚拟机主机(ECS)来提供ossfs服务, 您可以使用内网域名,比如在这个例子您可以将oss endpoint 改成oss-cn-hangzhou-internal.aliyuncs.com,这样可以节省带宽方面的费用。OSS的内网域名请参考访问域名和数据中心。 卸载bucketfusermount -u /tmp/ossfs更多详细内容请参考:GitHub ossfs 版本日志 请参考:GitHub ChangeLog

2019-12-01 23:15:14 0 浏览量 回答数 0

回答

楼主您好, 或许您可以试试这篇文章里提到的解决方法:《x64位windows 2003 server中“Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败”问题》, http://www.cnblogs.com/XiaoG/p/3438515.html ------------------------- 回 4楼(a63814) 的帖子 您好, 好哩,请等我找个测试机,为您在Windows 2008 R2 64位的系统上,运行您的这个asp文件,看看是否有不一样的结果喔。 ------------------------- 回 4楼(a63814) 的帖子 您好, 今天我在阿里云公共镜像里“Windows 2008 R2 64位标准版”系统上安装IIS,添加ASP的功能, 用您的脚本测试,正常。 服务器支持adodb.stream组件!

dongshan8 2019-12-02 02:14:50 0 浏览量 回答数 0

回答

<set> 中设置 lazy="false"###### Hibernate 异常org.hibernate.LazyInitializationException: could not initialize proxy - no Session 错误页面提示 could not initialize proxy - no Session 控制台 org.hibernate.LazyInitializationException: could not initialize proxy - no Session 病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,然后你使用了,导致该异常。 Q:我以get得到一个对象,在JSP页面以EL表达它的实例变量时,也抛出了该异常,在application的测试时却没有出现。 A:推测可能是该实例变量是hibernate进行加载的,可能hibernate本身是以load的方式将该实例变量得到。 解决方法: 方法1.用openSessionInView  方法2.把这个类的延迟加载禁掉 我自己的代码就多了这么一句话:          resultExchangeRatePojo.getDollarRmb();//在它的实例变量DollarRmb的session未关闭前存入,实际上将它载入内存。(我就想在没用关闭session之前用一下就可以把值保存到内存中了) 结果:果然页面上就正常显示了。 总结:原因是hibernate的session已经关闭,集合没有被初始化。在hibernate中:hibernate3 默认支持延迟加载(lazy="proxy"我们可以把proxy看作是true),hibernate2 默认立即加载 (lazy="false")。       在hibernate3中,所有的实体设置文件(user.hbm.xml)中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载,导致了以上情况的发生,在配置文件中将lzay属性设为false就可以了。 ---------------------------------------------------------------- 原因: <may-to-one>or<one-to-may>的lazy属性默认为:lazy = "proxy" 解决:<many-to-one>   & <set> 中设置 lazy="false" 

kun坤 2020-06-14 10:04:26 0 浏览量 回答数 0

回答

(1) jvm可以理解为一个由c++所编写的内存容器:包含了加载器,编译器等。当然了,我当时最困惑的就是class是怎么被执行的Java中的对象模型:OOP-Klass模型OOP:普通对象指针,Kcass:java类在c++中的对等体Kclass想jvm提供的功能:实现语言层面的java类实现java对象的派发 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(2) 根据以上所述,是不是明白了些什么呢,关于java的执行器:对于任意一门语言,如果不能被编译陈本机的可执行指令,则根本无法运行。众所周知,java编译器会将.java的文件编译成.class的文件而.class文件在物理机上是无法执行的,所以才有了(1)中对等层的概念。java的编译器分为:模板解析器,c++编译器 最终生产的都是机器码(别怀疑,就是这么做的)还有一种最老的是字节码解析器---->为什么现在不用了不知道原因的说 关于热点代码的问题:在jvm执行期间,会将一些循环的代码,经常用到的代码标记为热点----->那什么是热点呢,热点是怎么运行的呢热点代码,会被编译成本地的机器码。在执行期间,会有一个转发表,而热点代码相关的部分会与提前生成的机器码相关联----->提高运行速度 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(3)java的整个执行流程:.java--->.class--->类加载(aop[asm,gcb等],安全验证[为什么说java比较安全呢],连接[在解码中的符号引用])---->生成对等体---->动态编译---->执行执行(方法去,堆,栈)。 java的所有的一切都是在内存中进行的,这也是与c/c+不同的:对于c/c++等写的程序,会直接编译生成机器代码,而java的机器代码是动态生成的,换句话说 java将编译的过程委托给了虚拟机动态执行 (4) java的JNIJNI即:java本地方法,在jvm想执行class中的方法是,是通过jni才jvm的内存中进行查找,在执行。对于java中的方法,对象等概念,都统一理解为jvm的运行时数据就可以了。 (5)为什么要分方法区,常量区,堆,栈呢个人感觉 :程序就是数据结构+方法 在jvm的角度,这些都是给你的运行资源,进行GC等

小旋风柴进 2019-12-02 02:14:06 0 浏览量 回答数 0

回答

HTTP 1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 100-继续。 101-切换协议。 2xx-成功 这类状态代码表明服务器成功地接受了客户端请求。 200-确定。客户端请求已成功。 201-已创建。 202-已接受。 203-非权威性信息。 204-无内容。 205-重置内容。 206-部分内容。 3xx-重定向 客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 301-对象已永久移走,即永久重定向。 302-对象已临时移动。 304-未修改。 307-临时重定向。 4xx-客户端错误 发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。 401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示: 401.1-登录失败。 401.2-服务器配置导致登录失败。 401.3-由于ACL对资源的限制而未获得授权。 401.4-筛选器授权失败。 401.5-ISAPI/CGI应用程序授权失败。 401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。 403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因: 403.1-执行访问被禁止。 403.2-读访问被禁止。 403.3-写访问被禁止。 403.4-要求SSL。 403.5-要求SSL128。 403.6-IP地址被拒绝。 403.7-要求客户端证书。 403.8-站点访问被拒绝。 403.9-用户数过多。 403.10-配置无效。 403.11-密码更改。 403.12-拒绝访问映射表。 403.13-客户端证书被吊销。 403.14-拒绝目录列表。 403.15-超出客户端访问许可。 403.16-客户端证书不受信任或无效。 403.17-客户端证书已过期或尚未生效。 403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。 403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。 403.20-Passport登录失败。这个错误代码为IIS6.0所专用。 404-未找到。 404.0-(无)–没有找到文件或目录。 404.1-无法在所请求的端口上访问Web站点。 404.2-Web服务扩展锁定策略阻止本请求。 404.3-MIME映射策略阻止本请求。 405-用来访问本页面的HTTP谓词不被允许(方法不被允许) 406-客户端浏览器不接受所请求页面的MIME类型。 407-要求进行代理身份验证。 412-前提条件失败。 413–请求实体太大。 414-请求URI太长。 415–不支持的媒体类型。 416–所请求的范围无法满足。 417–执行失败。 423–锁定的错误。 5xx-服务器错误 服务器由于遇到错误而不能完成该请求。 500-内部服务器错误。 500.12-应用程序正忙于在Web服务器上重新启动。 500.13-Web服务器太忙。 500.15-不允许直接请求Global.asa。 500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。 500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。 500.100-内部ASP错误。 501-页眉值指定了未实现的配置。 502-Web服务器用作网关或代理服务器时收到了无效响应。 502.1-CGI应用程序超时。 502.2-CGI应用程序出错。application. 503-服务不可用。这个错误代码为IIS6.0所专用。 504-网关超时。 505-HTTP版本不受支持。 FTP 1xx-肯定的初步答复 这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 110重新启动标记答复。 120服务已就绪,在nnn分钟后开始。 125数据连接已打开,正在开始传输。 150文件状态正常,准备打开数据连接。 2xx-肯定的完成答复 一项操作已经成功完成。客户端可以执行新命令。200命令确定。 202未执行命令,站点上的命令过多。 211系统状态,或系统帮助答复。 212目录状态。 213文件状态。 214帮助消息。 215NAME系统类型,其中,NAME是AssignedNumbers文档中所列的正式系统名称。 220服务就绪,可以执行新用户的请求。 221服务关闭控制连接。如果适当,请注销。 225数据连接打开,没有进行中的传输。 226关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。 227进入被动模式(h1,h2,h3,h4,p1,p2)。 230用户已登录,继续进行。 250请求的文件操作正确,已完成。 257已创建“PATHNAME”。 3xx-肯定的中间答复 该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。331用户名正确,需要密码。 332需要登录帐户。 350请求的文件操作正在等待进一步的信息。 4xx-瞬态否定的完成答复 该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。421服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。 425无法打开数据连接。 426Connectionclosed;transferaborted. 450未执行请求的文件操作。文件不可用(例如,文件繁忙)。 451请求的操作异常终止:正在处理本地错误。 452未执行请求的操作。系统存储空间不够。 5xx-永久性否定的完成答复 该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。500语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。 501在参数中有语法错误。 502未执行命令。 503错误的命令序列。 504未执行该参数的命令。 530未登录。 532存储文件需要帐户。 550未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。 551请求的操作异常终止:未知的页面类型。 552请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。 553未执行请求的操作。不允许的文件名。 常见的FTP状态代码及其原因 150-FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器准备在端口20上打开新连接,发送一些数据。 226-命令在端口20上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。 230-客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。 331-客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。 426-命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。 530-该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS的配置可能拒绝匿名访问。 550-命令未被执行,因为指定的文件不可用。例如,要GET的文件并不存在,或试图将文件PUT到您没有写入权限的目录。

元芳啊 2019-12-02 00:44:14 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 对象存储OSS控制台可以查看Bucket统计和Object统计,方便用户分析文件访问情况。查看Bucket统计方法:登陆管理控制台--【对象存储】--【资源监控报表】--【Bucket统计】,可以选择Bucket,选择时间范围,查看对应Bucket的访问情况,可以查看访问方式,PV,UV,错误访问次数,平均PV流量,平均UV流量,流量情况。查看Object统计方法:登陆管理控制台--【对象存储】--【资源监控报表】--【Object统计】,可以选择Bucket,选择时间范围,查看对应Bucket下的Object的访问情况,可以查看访问方式,PV,UV,TOP,错误访问次数,流量情况。如果问题还未能解决,请联系售后技术支持。

2019-12-01 23:31:24 0 浏览量 回答数 0

回答

有时,我们可能想使用mongoexport的查询参数导出集合的某一特定部分。例如,一个notebook集合(collection),每个notebook文档(document)的文档都有一个生产日期属性。 1234567891011121314151617181920212223242526272829303132333435{ "_id" : ObjectId("531ce460000000019b9643bc"), "company" : "Samsung", "date" : ISODate("2014-03-09T22:00:00Z"), "price" : 2000, "brand" : "Ultrabook", }{ "_id" : ObjectId("531ce460000000019b9643ba"), "company" : "Sony", "date" : ISODate("2014-03-08T22:00:00Z"), "price" : 1500, "brand" : "Vaio", }{ "_id" : ObjectId("531ce460000000019b9643bd"), "company" : "Apple", "date" : ISODate("2014-03-07T22:00:00Z"), "price" : 2250, "brand" : "MacbookPro", }{ "_id" : ObjectId("531ce460000000019b9643be"), "company" : "Apple", "date" : ISODate("2014-03-06T22:00:00Z"), "price" : 1200, "brand" : "MacbookAir", }{ "_id" : ObjectId("531ce460000000019b9643bf"), "company" : "Samsung", "date" : ISODate("2014-03-05T22:00:00Z"), "price" : 1000, "brand" : "Ultrabook", }mongoexport的定义如下: 1mongoexport --db --collection --query --out 主要的问题是在查询中不能使用ISODate("")对象作为时间的查询条件,必须转换成Date对象。例如,我们要查找生产日期位于2014-03-09T22:00:00Z 和 2014-03-07T22:00:00Z之间的苹果公司的笔记本(notebook); mongoexport --db test --collection notebooks --query '{ company:"Apple", date: { $lt: ISODate("2014-03-09T22:00:00Z") , $gte: ISODate("2014-03-07T22:00:00Z")} }' --out example.1mongoexport --db test --collection notebooks --query '{ company:"Apple", date: { $lt: ISODate("2014-03-09T22:00:00Z") , $gte: ISODate("2014-03-07T22:00:00Z")} }' --out example.json将得到以下错误: ERROR ERROR: too many positional options 有两种方法可以把ISODate对象转成Date对象,方法如下: (1)使用mongo shell中的JavaScript脚本;var a = ISODate('2014-03-10T22:00:00Z');a.getTime() 12var a = ISODate('2014-03-10T22:00:00Z');a.getTime()(2)把 ISODate数据转成毫秒,然后在转成Date对象; ISODate("2014-03-10T22:00:00Z").valueOf() 现在可以使用正确的Date时间进行查询: 1mongoexport --db test --collection notebooks --query "{ company:"Apple", date: { $lt: new Date(1394402400000) , $gte: new Date(1394229600000)} }" --out example.jso最后会在当前文件夹下得到一个json文件,只包含一个文档记录; { "_id" : ObjectId("531ce460000000019b9643bd"), "company" : "Apple", "date" : ISODate("2014-03-07T22:00:00Z"), "price" : 2250, "brand" : "MacbookPro", }1234567{ "_id" : ObjectId("531ce460000000019b9643bd"), "company" : "Apple", "date" : ISODate("2014-03-07T22:00:00Z"), "price" : 2250, "brand" : "MacbookPro", }

51干警网 2019-12-02 01:41:17 0 浏览量 回答数 0

回答

Re照相图片用js上传报错? 我用jQuery+ajax试过,可行,但没有用原生的 XmlHttpRequest 试过. ajax方法中有两个个参数: processData:false; contentType: false 不知是不是跟这个参数有关系。 ------------------------- 回 5楼买域名专用的帖子 你这个是 <input file>   选择的吧?不是相机返回的? 答:对。 ------------------------- Re照相图片用js上传报错? 以图中 第一个语句 file是一个File 对象。 而在第二句中,imageURI 应该是一个字符串吧? 我想这是差异而导致不到上传的原因。 ------------------------- Re回 8楼陈景标的帖子 引用第9楼买域名专用于2016-06-15 00:25发表的 回 8楼陈景标的帖子 : 第二句的意思是, 手机拍照,返回的 那个  图片的名字, 上传到自己的服务器是正常的,因为自己服务器上,是自己写的接收功能 上传到 oss 提示的错误就是,图片上的 主要是因为,不是表单文件,没有那个 from的 分界线。 ....... [url=https://bbs.aliyun.com/job.php?action=topost&tid=284936&pid=796491][/url] 那你现在解决了?

陈景标 2019-12-02 02:57:15 0 浏览量 回答数 0

问题

ossfs之如何实现快速安装?

青衫无名 2019-12-01 21:59:07 1807 浏览量 回答数 0

问题

钉钉开发入门前端Nowa脚手架篇

钉友 2019-12-01 21:33:36 6369 浏览量 回答数 0

回答

在Kubernetes中管理配置的最佳方法是创建ConfigMap对象并将其作为volume /文件夹安装到pod中。将ConfigMap挂载为volume :https: //kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#add-configmap-data-to-a-volume

k8s小能手 2019-12-02 01:52:49 0 浏览量 回答数 0

问题

【漏洞公告】微软“周二补丁日”—2018年08月

正禾 2019-12-01 21:33:34 14874 浏览量 回答数 9

回答

struct 模块可被用来编码/解码几乎所有类型的二进制的数据结构。为了解释清楚这种数据,假设你用下面的Python数据结构 来表示一个组成一系列多边形的点的集合: polys = [ [ (1.0, 2.5), (3.5, 4.0), (2.5, 1.5) ], [ (7.0, 1.2), (5.1, 3.0), (0.5, 7.5), (0.8, 9.0) ], [ (3.4, 6.3), (1.2, 0.5), (4.6, 9.2) ], ] 现在假设这个数据被编码到一个以下列头部开始的二进制文件中去了: +------+--------+------------------------------------+ |Byte | Type | Description | +======+========+====================================+ |0 | int | 文件代码(0x1234,小端) | +------+--------+------------------------------------+ |4 | double | x 的最小值(小端) | +------+--------+------------------------------------+ |12 | double | y 的最小值(小端) | +------+--------+------------------------------------+ |20 | double | x 的最大值(小端) | +------+--------+------------------------------------+ |28 | double | y 的最大值(小端) | +------+--------+------------------------------------+ |36 | int | 三角形数量(小端) | +------+--------+------------------------------------+ 紧跟着头部是一系列的多边形记录,编码格式如下: +------+--------+-------------------------------------------+ |Byte | Type | Description | +======+========+===========================================+ |0 | int | 记录长度(N字节) | +------+--------+-------------------------------------------+ |4-N | Points | (X,Y) 坐标,以浮点数表示 | +------+--------+-------------------------------------------+ 为了写这样的文件,你可以使用如下的Python代码: import struct import itertools def write_polys(filename, polys): # Determine bounding box flattened = list(itertools.chain(*polys)) min_x = min(x for x, y in flattened) max_x = max(x for x, y in flattened) min_y = min(y for x, y in flattened) max_y = max(y for x, y in flattened) with open(filename, 'wb') as f: f.write(struct.pack('<iddddi', 0x1234, min_x, min_y, max_x, max_y, len(polys))) for poly in polys: size = len(poly) * struct.calcsize('<dd') f.write(struct.pack('<i', size + 4)) for pt in poly: f.write(struct.pack('<dd', *pt)) 将数据读取回来的时候,可以利用函数 struct.unpack() ,代码很相似,基本就是上面写操作的逆序。如下: def read_polys(filename): with open(filename, 'rb') as f: # Read the header header = f.read(40) file_code, min_x, min_y, max_x, max_y, num_polys = \ struct.unpack('<iddddi', header) polys = [] for n in range(num_polys): pbytes, = struct.unpack('<i', f.read(4)) poly = [] for m in range(pbytes // 16): pt = struct.unpack('<dd', f.read(16)) poly.append(pt) polys.append(poly) return polys 尽管这个代码可以工作,但是里面混杂了很多读取、解包数据结构和其他细节的代码。如果用这样的代码来处理真实的数据文件, 那未免也太繁杂了点。因此很显然应该有另一种解决方法可以简化这些步骤,让程序员只关注自最重要的事情。 在本小节接下来的部分,我会逐步演示一个更加优秀的解析字节数据的方案。 目标是可以给程序员提供一个高级的文件格式化方法,并简化读取和解包数据的细节。但是我要先提醒你, 本小节接下来的部分代码应该是整本书中最复杂最高级的例子,使用了大量的面向对象编程和元编程技术。 一定要仔细的阅读我们的讨论部分,另外也要参考下其他章节内容。 首先,当读取字节数据的时候,通常在文件开始部分会包含文件头和其他的数据结构。 尽管struct模块可以解包这些数据到一个元组中去,另外一种表示这种信息的方式就是使用一个类。 就像下面这样: import struct class StructField: ''' Descriptor representing a simple structure field ''' def __init__(self, format, offset): self.format = format self.offset = offset def __get__(self, instance, cls): if instance is None: return self else: r = struct.unpack_from(self.format, instance._buffer, self.offset) return r[0] if len(r) == 1 else r class Structure: def __init__(self, bytedata): self._buffer = memoryview(bytedata) 这里我们使用了一个描述器来表示每个结构字段,每个描述器包含一个结构兼容格式的代码以及一个字节偏移量, 存储在内部的内存缓冲中。在 __get__() 方法中,struct.unpack_from() 函数被用来从缓冲中解包一个值,省去了额外的分片或复制操作步骤。 Structure 类就是一个基础类,接受字节数据并存储在内部的内存缓冲中,并被 StructField 描述器使用。 这里使用了 memoryview() ,我们会在后面详细讲解它是用来干嘛的。 使用这个代码,你现在就能定义一个高层次的结构对象来表示上面表格信息所期望的文件格式。例如: class PolyHeader(Structure): file_code = StructField('<i', 0) min_x = StructField('<d', 4) min_y = StructField('<d', 12) max_x = StructField('<d', 20) max_y = StructField('<d', 28) num_polys = StructField('<i', 36) 下面的例子利用这个类来读取之前我们写入的多边形数据的头部数据: >>> f = open('polys.bin', 'rb') >>> phead = PolyHeader(f.read(40)) >>> phead.file_code == 0x1234 True >>> phead.min_x 0.5 >>> phead.min_y 0.5 >>> phead.max_x 7.0 >>> phead.max_y 9.2 >>> phead.num_polys 3 >>> 这个很有趣,不过这种方式还是有一些烦人的地方。首先,尽管你获得了一个类接口的便利, 但是这个代码还是有点臃肿,还需要使用者指定很多底层的细节(比如重复使用 StructField ,指定偏移量等)。 另外,返回的结果类同样确实一些便利的方法来计算结构的总数。 任何时候只要你遇到了像这样冗余的类定义,你应该考虑下使用类装饰器或元类。 元类有一个特性就是它能够被用来填充许多低层的实现细节,从而释放使用者的负担。 下面我来举个例子,使用元类稍微改造下我们的 Structure 类: class StructureMeta(type): ''' Metaclass that automatically creates StructField descriptors ''' def __init__(self, clsname, bases, clsdict): fields = getattr(self, '_fields_', []) byte_order = '' offset = 0 for format, fieldname in fields: if format.startswith(('<','>','!','@')): byte_order = format[0] format = format[1:] format = byte_order + format setattr(self, fieldname, StructField(format, offset)) offset += struct.calcsize(format) setattr(self, 'struct_size', offset) class Structure(metaclass=StructureMeta): def __init__(self, bytedata): self._buffer = bytedata @classmethod def from_file(cls, f): return cls(f.read(cls.struct_size)) 使用新的 Structure 类,你可以像下面这样定义一个结构: class PolyHeader(Structure): _fields_ = [ ('<i', 'file_code'), ('d', 'min_x'), ('d', 'min_y'), ('d', 'max_x'), ('d', 'max_y'), ('i', 'num_polys') ] 正如你所见,这样写就简单多了。我们添加的类方法 from_file() 让我们在不需要知道任何数据的大小和结构的情况下就能轻松的从文件中读取数据。比如: >>> f = open('polys.bin', 'rb') >>> phead = PolyHeader.from_file(f) >>> phead.file_code == 0x1234 True >>> phead.min_x 0.5 >>> phead.min_y 0.5 >>> phead.max_x 7.0 >>> phead.max_y 9.2 >>> phead.num_polys 3 >>> 一旦你开始使用了元类,你就可以让它变得更加智能。例如,假设你还想支持嵌套的字节结构, 下面是对前面元类的一个小的改进,提供了一个新的辅助描述器来达到想要的效果: class NestedStruct: ''' Descriptor representing a nested structure ''' def __init__(self, name, struct_type, offset): self.name = name self.struct_type = struct_type self.offset = offset def __get__(self, instance, cls): if instance is None: return self else: data = instance._buffer[self.offset: self.offset+self.struct_type.struct_size] result = self.struct_type(data) # Save resulting structure back on instance to avoid # further recomputation of this step setattr(instance, self.name, result) return result class StructureMeta(type): ''' Metaclass that automatically creates StructField descriptors ''' def __init__(self, clsname, bases, clsdict): fields = getattr(self, '_fields_', []) byte_order = '' offset = 0 for format, fieldname in fields: if isinstance(format, StructureMeta): setattr(self, fieldname, NestedStruct(fieldname, format, offset)) offset += format.struct_size else: if format.startswith(('<','>','!','@')): byte_order = format[0] format = format[1:] format = byte_order + format setattr(self, fieldname, StructField(format, offset)) offset += struct.calcsize(format) setattr(self, 'struct_size', offset) 在这段代码中,NestedStruct 描述器被用来叠加另外一个定义在某个内存区域上的结构。 它通过将原始内存缓冲进行切片操作后实例化给定的结构类型。由于底层的内存缓冲区是通过一个内存视图初始化的, 所以这种切片操作不会引发任何的额外的内存复制。相反,它仅仅就是之前的内存的一个叠加而已。 另外,为了防止重复实例化,通过使用和8.10小节同样的技术,描述器保存了该实例中的内部结构对象。 使用这个新的修正版,你就可以像下面这样编写: class Point(Structure): _fields_ = [ ('<d', 'x'), ('d', 'y') ] class PolyHeader(Structure): _fields_ = [ ('<i', 'file_code'), (Point, 'min'), # nested struct (Point, 'max'), # nested struct ('i', 'num_polys') ] 令人惊讶的是,它也能按照预期的正常工作,我们实际操作下: >>> f = open('polys.bin', 'rb') >>> phead = PolyHeader.from_file(f) >>> phead.file_code == 0x1234 True >>> phead.min # Nested structure <__main__.Point object at 0x1006a48d0> >>> phead.min.x 0.5 >>> phead.min.y 0.5 >>> phead.max.x 7.0 >>> phead.max.y 9.2 >>> phead.num_polys 3 >>> 到目前为止,一个处理定长记录的框架已经写好了。但是如果组件记录是变长的呢? 比如,多边形文件包含变长的部分。 一种方案是写一个类来表示字节数据,同时写一个工具函数来通过多少方式解析内容。跟6.11小节的代码很类似: class SizedRecord: def __init__(self, bytedata): self._buffer = memoryview(bytedata) @classmethod def from_file(cls, f, size_fmt, includes_size=True): sz_nbytes = struct.calcsize(size_fmt) sz_bytes = f.read(sz_nbytes) sz, = struct.unpack(size_fmt, sz_bytes) buf = f.read(sz - includes_size * sz_nbytes) return cls(buf) def iter_as(self, code): if isinstance(code, str): s = struct.Struct(code) for off in range(0, len(self._buffer), s.size): yield s.unpack_from(self._buffer, off) elif isinstance(code, StructureMeta): size = code.struct_size for off in range(0, len(self._buffer), size): data = self._buffer[off:off+size] yield code(data) 类方法 SizedRecord.from_file() 是一个工具,用来从一个文件中读取带大小前缀的数据块, 这也是很多文件格式常用的方式。作为输入,它接受一个包含大小编码的结构格式编码,并且也是自己形式。 可选的 includes_size 参数指定了字节数是否包含头部大小。 下面是一个例子教你怎样使用从多边形文件中读取单独的多边形数据: >>> f = open('polys.bin', 'rb') >>> phead = PolyHeader.from_file(f) >>> phead.num_polys 3 >>> polydata = [ SizedRecord.from_file(f, '<i') ... for n in range(phead.num_polys) ] >>> polydata [<__main__.SizedRecord object at 0x1006a4d50>, <__main__.SizedRecord object at 0x1006a4f50>, <__main__.SizedRecord object at 0x10070da90>] >>> 可以看出,SizedRecord 实例的内容还没有被解析出来。 可以使用 iter_as() 方法来达到目的,这个方法接受一个结构格式化编码或者是 Structure 类作为输入。 这样子可以很灵活的去解析数据,例如: >>> for n, poly in enumerate(polydata): ... print('Polygon', n) ... for p in poly.iter_as('<dd'): ... print(p) ... Polygon 0 (1.0, 2.5) (3.5, 4.0) (2.5, 1.5) Polygon 1 (7.0, 1.2) (5.1, 3.0) (0.5, 7.5) (0.8, 9.0) Polygon 2 (3.4, 6.3) (1.2, 0.5) (4.6, 9.2) >>> >>> for n, poly in enumerate(polydata): ... print('Polygon', n) ... for p in poly.iter_as(Point): ... print(p.x, p.y) ... Polygon 0 1.0 2.5 3.5 4.0 2.5 1.5 Polygon 1 7.0 1.2 5.1 3.0 0.5 7.5 0.8 9.0 Polygon 2 3.4 6.3 1.2 0.5 4.6 9.2 >>> 将所有这些结合起来,下面是一个 read_polys() 函数的另外一个修正版: class Point(Structure): _fields_ = [ ('<d', 'x'), ('d', 'y') ] class PolyHeader(Structure): _fields_ = [ ('<i', 'file_code'), (Point, 'min'), (Point, 'max'), ('i', 'num_polys') ] def read_polys(filename): polys = [] with open(filename, 'rb') as f: phead = PolyHeader.from_file(f) for n in range(phead.num_polys): rec = SizedRecord.from_file(f, '<i') poly = [ (p.x, p.y) for p in rec.iter_as(Point) ] polys.append(poly) return polys

哦哦喔 2020-04-17 13:26:19 0 浏览量 回答数 0

回答

域名不能正确解析可以更换其它的dns服务器,在百度搜索“公用dns”,选一个就行了 IIS状态代码的含义 概要 当用户试图通过HTTP或文件传输协议(FTP)访问一台正在运行Internet信息服务(IIS)的服务器上的内容时,IIS返回一个表示该请求的状态的数字代码。该状态代码记录在IIS日志中,同时也可能在Web浏览器或FTP客户端显示。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。 更多信息 日志文件的位置 在默认状态下,IIS把它的日志文件放在%WINDIR\System32\Logfiles文件夹中。每个万维网(WWW)站点和FTP站点在该目录下都有一个单独的目录。在默认状态下,每天都会在这些目录下创建日志文件,并用日期给日志文件命名(例如,exYYMMDD.log)。 HTTP 1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 100-继续。 101-切换协议。 2xx-成功 这类状态代码表明服务器成功地接受了客户端请求。 200-确定。客户端请求已成功。 201-已创建。 202-已接受。 203-非权威性信息。 204-无内容。 205-重置内容。 206-部分内容。 3xx-重定向 客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 301-对象已永久移走,即永久重定向。 302-对象已临时移动。 304-未修改。 307-临时重定向。 4xx-客户端错误 发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。 401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示: 401.1-登录失败。 401.2-服务器配置导致登录失败。 401.3-由于ACL对资源的限制而未获得授权。 401.4-筛选器授权失败。 401.5-ISAPI/CGI应用程序授权失败。 401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。 403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因: 403.1-执行访问被禁止。 403.2-读访问被禁止。 403.3-写访问被禁止。 403.4-要求SSL。 403.5-要求SSL128。 403.6-IP地址被拒绝。 403.7-要求客户端证书。 403.8-站点访问被拒绝。 403.9-用户数过多。 403.10-配置无效。 403.11-密码更改。 403.12-拒绝访问映射表。 403.13-客户端证书被吊销。 403.14-拒绝目录列表。 403.15-超出客户端访问许可。 403.16-客户端证书不受信任或无效。 403.17-客户端证书已过期或尚未生效。 403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。 403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。 403.20-Passport登录失败。这个错误代码为IIS6.0所专用。 404-未找到。 404.0-(无)–没有找到文件或目录。 404.1-无法在所请求的端口上访问Web站点。 404.2-Web服务扩展锁定策略阻止本请求。 404.3-MIME映射策略阻止本请求。 405-用来访问本页面的HTTP谓词不被允许(方法不被允许) 406-客户端浏览器不接受所请求页面的MIME类型。 407-要求进行代理身份验证。 412-前提条件失败。 413–请求实体太大。 414-请求URI太长。 415–不支持的媒体类型。 416–所请求的范围无法满足。 417–执行失败。 423–锁定的错误。 5xx-服务器错误 服务器由于遇到错误而不能完成该请求。 500-内部服务器错误。 500.12-应用程序正忙于在Web服务器上重新启动。 500.13-Web服务器太忙。 500.15-不允许直接请求Global.asa。 500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。 500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。 500.100-内部ASP错误。 501-页眉值指定了未实现的配置。 502-Web服务器用作网关或代理服务器时收到了无效响应。 502.1-CGI应用程序超时。 502.2-CGI应用程序出错。application. 503-服务不可用。这个错误代码为IIS6.0所专用。 504-网关超时。 505-HTTP版本不受支持。 FTP 1xx-肯定的初步答复 这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 110重新启动标记答复。 120服务已就绪,在nnn分钟后开始。 125数据连接已打开,正在开始传输。 150文件状态正常,准备打开数据连接。 2xx-肯定的完成答复 一项操作已经成功完成。客户端可以执行新命令。200命令确定。 202未执行命令,站点上的命令过多。 211系统状态,或系统帮助答复。 212目录状态。 213文件状态。 214帮助消息。 215NAME系统类型,其中,NAME是AssignedNumbers文档中所列的正式系统名称。 220服务就绪,可以执行新用户的请求。 221服务关闭控制连接。如果适当,请注销。 225数据连接打开,没有进行中的传输。 226关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。 227进入被动模式(h1,h2,h3,h4,p1,p2)。 230用户已登录,继续进行。 250请求的文件操作正确,已完成。 257已创建“PATHNAME”。 3xx-肯定的中间答复 该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。331用户名正确,需要密码。 332需要登录帐户。 350请求的文件操作正在等待进一步的信息。 4xx-瞬态否定的完成答复 该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。421服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。 425无法打开数据连接。 426Connectionclosed;transferaborted. 450未执行请求的文件操作。文件不可用(例如,文件繁忙)。 451请求的操作异常终止:正在处理本地错误。 452未执行请求的操作。系统存储空间不够。 5xx-永久性否定的完成答复 该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。500语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。 501在参数中有语法错误。 502未执行命令。 503错误的命令序列。 504未执行该参数的命令。 530未登录。 532存储文件需要帐户。 550未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。 551请求的操作异常终止:未知的页面类型。 552请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。 553未执行请求的操作。不允许的文件名。 常见的FTP状态代码及其原因 150-FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器准备在端口20上打开新连接,发送一些数据。 226-命令在端口20上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。 230-客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。 331-客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。 426-命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。 530-该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS的配置可能拒绝匿名访问。 550-命令未被执行,因为指定的文件不可用。例如,要GET的文件并不存在,或试图将文件PUT到您没有写入权限的目录。 答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 03:01:30 0 浏览量 回答数 0

问题

OSS用JavaScript-SDK一次上传多个文件的方法

轩儿qq 2019-12-01 19:25:25 2441 浏览量 回答数 3

回答

监控WIN2003文件服务器上的文件夹和文件的复制、删除。 比如是哪个域用户复制了或是哪个域用户删除了文件和文件夹。 目的:文件服务器里的公共文件夹缺少访问行为监控,误删或故意删除可能会造成数据丢失。文件夹丢失的原因无法查清,可能是误删除,也可能是故意删除。需要进行两个操作。 一个是在安全策略里面启用“审核对象访问”,开启这个功能 方法是右键选择你需要查看操作日志的文件的属性,选择“安全”-- “高级”--"审核"--然后添加一个需要审核的用户,例如everyone--再选择具体的审核项目,例如是审核用户是否运行过这个文件,是否重命名这个文件等等,如果希望审核所有操作,就选择完全控制。 最后,再到安全性日志中就可以查看到具体的操作记录。 看看你是否开启了“审核对象访问”功能

元芳啊 2019-12-02 02:10:09 0 浏览量 回答数 0

回答

上传数据有问题 先谢谢楼主,但是为什么我上传(putObject)之后就没有反应了呢,OSSObjectPutObjectFinish 和 OSSObjectPutObjectFailed都没有调用 关键代码: //依次上传文件        for (NSString * filepath in array) {            //读取文件内容            NSData * data = [NSData dataWithContentsOfFile:filepath];            //objMetadata这个不理解???            ObjectMetadata * objMetadata = [[ObjectMetadata alloc] init];            //上传            [_client putObject:@"flysurvey" key:projectNumber data:data objectMetadata:objMetadata];            [objMetadata release];        } 回调: #pragma mark - 阿里云上传/** PutObject 方法执行成功 @param client OSSClient @param result PutObjectResult */-(void)OSSObjectPutObjectFinish:(OSSClient*) client result:(PutObjectResult*) result{    NSLog(@"上传成功,%@", result);} /** PutObject 方法执行失败,返回OSSError对象 @param client OSSClient @param error OSSError */-(void)OSSObjectPutObjectFailed:(OSSClient*) client error:(OSSError*) error{    NSLog(@"上传失败,%@", error);} ------------------------- Re开了个源aliyunOSSiOSSDK 对了,楼主提供的帮助文档地址打不开呢 http://osssdkhelp.sinaapp.com/

zhongyanaimei 2019-12-01 23:50:06 0 浏览量 回答数 0

回答

先说release,不是直接释放内存,是引用计数-1,而当引用计数0的时候,sdk会gc掉这段内存。应用的main函数里可以看到,有初始化一个AutoRealesePool,就是干这个。另外,每个对象都有autorelease方法,对他调用一把autorelease后,就不用手动release了。再看示例代码,这个要看你 ClassB 里 property 的定义:如果是@property (copy) ClassB * b,那么setProperty的时候内存里会复制一个a,付给b。则(a-> mema[rc=1], b->memb[rc=1])如果是@property (retain) ClassB * b,就给a的引用计数+1,b还是指向这段内存。则(a-> mema[rc=2] <-b)所以,setProperty以后,对a调用release的时候,就是把a指向的内存段的rc-1。copy的情况下,a已经不可以调用了,掉了就会BAD_ACCESS,retain的情况下,a还可以调用,因为他的rc=2-1=1。再说llvm3里抛弃这个的问题,llvm3有个特性,叫ARC,就是AutoReferenceCount,rc被自动管理了。在ARC打开的文件中,release autorelease retain 都是不允许使用的。在XCode的编译规则中可以加参数选择是否使用ARC编译某个文件。后ARC时代,要注意属性是函数局部的,还是类全局的这些,因为,开发者已经不需要手动回收内存,ARC会依据他的可见性,或者是生命周期去处理。在使用完某个对象后,要 =nil一下,ARC会马上干掉他。最后,在前ARC时代几个简单的规则:使用alloc创建的实例引用计 rc=1作为addObject:等方法的参数 rc+=1作为removeObject:等方法的参数 rc-=1调用removeFromeOOXX方法 rc-=1调用 retain rc+=1调用 copy 复制一份 rc不变调用 release rc-=1---- 使用建议 ----使用alloc创建后,一定要使用release释放,或调用autorelease交给系统管理add以后,一定记得remove

a123456678 2019-12-02 03:12:19 0 浏览量 回答数 0

问题

C++ SDK是什么?

nicenelly 2019-12-01 21:01:22 1566 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:02 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播