文档章节

关于aws S3文件上传的锁问题

o0无忧亦无怖
 o0无忧亦无怖
发布于 2017/02/17 13:35
字数 648
阅读 12
收藏 0

#问题出现情况 由于客户端是(安卓、iOS、PC)多个版本的,因此,要传不同的文件到S3服务器,但是在上传完毕之后,出现了无法删除本地文件的提示 “text file busy”

#问题的分析 text file busy 即文件正忙,因此可能出现的原因有:

1.文件还没有上传完

2.文件被进程锁定了

3.文件资源没有被释放(因为aws的SDK是封装好的,因此当时我相信了他,么有考虑这一点,最后发现居然就是这一点)

#查看官方文档

public Guzzle\Service\Resource\Model putObject( array $args = array() )

$arg是参数

$result = $client->putObject(array(
    'ACL' => 'string',
    'Body' => 'mixed type: string|resource|\Guzzle\Http\EntityBodyInterface',
    // Bucket is required
    'Bucket' => 'string',
    'CacheControl' => 'string',
    'ContentDisposition' => 'string',
    'ContentEncoding' => 'string',
    'ContentLanguage' => 'string',
    'ContentLength' => integer,
    'ContentType' => 'string',
    'Expires' => 'mixed type: string (date format)|int (unix timestamp)|\DateTime',
    'GrantFullControl' => 'string',
    'GrantRead' => 'string',
    'GrantReadACP' => 'string',
    'GrantWriteACP' => 'string',
    // Key is required
    'Key' => 'string',
    'Metadata' => array(
        // Associative array of custom 'string' key names
        'string' => 'string',
        // ... repeated
    ),
    'ServerSideEncryption' => 'string',
    'StorageClass' => 'string',
    'WebsiteRedirectLocation' => 'string',
    'SSECustomerAlgorithm' => 'string',
    'SSECustomerKey' => 'string',
    'SSECustomerKeyMD5' => 'string',
    'SSEKMSKeyId' => 'string',
    'RequestPayer' => 'string',
));

官方示例

$result = $client->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'data.txt',
    'Body'   => 'Hello!'
));

#强制获取文件返回方式(DEBUG过程) 首先,我们尝试用获取到返回值回调的方式进行判断(我们认为是文件还在上传过程中)。下面是官方的demo:

$result = $client->putObject(array(
    'Bucket'     => $bucket,
    'Key'        => 'data_from_file.txt',
    'SourceFile' => $pathToFile,
    'Metadata'   => array(
        'Foo' => 'abc',
        'Baz' => '123'
    )
));

// We can poll the object until it is accessible
$client->waitUntil('ObjectExists', array(
    'Bucket' => $this->bucket,
    'Key'    => 'data_from_file.txt'
));

然而问题并没有得到解决,但是文件很明显的是上传上去了的。同时,证明了putObject是个同步的操作而不是异步,因为他产生了很明显的延迟。

#继续查阅文档

$client->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'data_from_stream.txt',
    'Body'   => fopen($pathToFile, 'r+')
));

发现S3上传是可以通过资源或者字符流方式进行上传,因此,修改代码。

    try{
			if(isset($data['SourceFile'])) {
				$data['Body'] = fopen($data['SourceFile'],'r+');
				unset($data['SourceFile']);
			}
			$this->_s3->putObject($data);
			fclose($data['Body']);
		} catch(\Exception $e) {
			return $e->getMessage();
	}

不再相信S3会自动释放文件资源,果然,本地文件已被删除。

#推测

AWS的S3的SDK是没有对文件进行释放,而它内部普遍采用static的方法和类,因此文件释放的时机是由PHP决定。 所以出现了text file busy的错误。

#解决方案

不要相信SDK能处理好一切,对于本地的资源类型和需要上锁的操作交由自己来管理。

© 著作权归作者所有

共有 人打赏支持
o0无忧亦无怖
粉丝 33
博文 76
码字总数 50359
作品 1
程序员
Linux服务器通过aws命令行上传文件至S3

目的 Linux服务器通过AWS命令行上传文件至S3 配置 打开你的AWS控制台; 连接你的Linux服务器,按照以下步骤操作; # 安装pip yum -y install python-pip # 安装awscli pip install awscli #...

M玺
2017/05/17
0
0
为什么是无服务器计算?第一手AWS lambda测试报告!

摘要:第一手的一步一步的,带你体验亚马逊“函数即服务(function as aservice)”平台。 为什么一名开发者应该使用AWS Lambda?简单一句话的说,AWS Lambda-是另外一种事件驱动方式,“fun...

xiaoli110
06/26
0
0
AWS亚马逊S3云储存怎么批量上传文件夹?用Python吧!

AWS S3 在浏览器没有拖动文件夹上传的功能,手动维护文件实在是太过辛苦了,用Python API吧! AWS S3 才是当今世界上最大的云存储。虽然 S3 服务的对象多为企业用户,你同样可以使用它搭建个...

阿锋zxf
05/16
0
0
挖洞经验 看我如何发现苹果公司官网Apple.com的无限制文件上传漏洞

        在前几篇文章中,我分享了亚马逊网站XSS漏洞和Bol.com的开放重定向漏洞,今天我再和大家聊聊不安全的服务器配置问题,很多时候,服务器的错误配置将会导致一些列目录或无限制文...

FreeBuf
07/11
0
0
如何利用 AWS Lambda 和 Tensorflow 部署深度学习模型

深度学习已经彻底变革了我们处理和加工真实数据的方式。深度学习的应用程序有多种类型,包括用于整理用户照片存档、推荐书籍、检测欺诈行为以及感知自动驾驶车辆周边环境的应用程序。 在这篇...

亚马逊AWS
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部