php s3 sdk,PHP Amazon SDK – s3 putObject和set Body

嗨,我正在尝试用一个新的对象进入一个桶与这个代码:

require_once(FCPATH.'s3/aws-autoloader.PHP');

use Aws\S3\S3Client;

class s3{

public $_secret_key ="********";

public $_access_key = "********";

public $_bucket = "tphotos-dev";

function connect(){

return S3Client::factory(array(

'key' => $this->_access_key,'secret' => $this->_secret_key,));

}

function deleteObject($prefix = false){

if($prefix){

$s3 = $this->connect();

return $s3->deleteMatchingObjects($this->_bucket,$prefix);

}

}

function putObject($file_name,$source_file){

$s3 = $this->connect();

$s3->putObject(array(

'Bucket' => (string)$this->_bucket,'Key' => $file_name,'SourceFile' => $source_file,'ACL' => 'public-read',));

return $s3->waitUntilObjectExists(array(

'Bucket' => $this->_bucket,'Key' => $file_name

));

}

}

?>

所以一旦我做例如:

$s3->putObject('myfilename.jpg',get_file_content("temp/image.jpg"));

它返回错误:

Fatal error: Uncaught exception 'Aws\Common\Exception\InvalidArgumentException' with message 'You must specify a non-null value for the Body or SourceFile parameters.' in /Users/ok/Projects/s3/Aws/Common/Client/UploadBodyListener.PHP:91

任何线索?

以下是一份使用C++亚马逊SDK线程池实现vstor传输到亚马逊云s3的示例代码: ```c++ #include <iostream> #include <fstream> #include <sstream> #include <thread> #include <mutex> #include <condition_variable> #include <aws/core/Aws.h> #include <aws/s3/S3Client.h> #include <aws/s3/model/PutObjectRequest.h> #include <aws/core/utils/memory/stl/AWSStringStream.h> #include <aws/core/utils/StringUtils.h> #include <aws/core/utils/threading/Executor.h> #include <aws/core/utils/threading/ThreadPool.h> using namespace std; using namespace Aws::S3; using namespace Aws::S3::Model; using namespace Aws::Utils; using namespace Aws::Utils::Threading; // 亚马逊s3存储桶名称文件名 static const char* BUCKET_NAME = "my-bucket"; static const char* OBJECT_KEY = "my-object-key"; // 读取vstor文件的线程任务类 class FileReaderTask : public Runnable { public: FileReaderTask(const char* file_path, char* buffer, int buffer_size) : m_file_path(file_path), m_buffer(buffer), m_buffer_size(buffer_size) {} void Run() override { ifstream file(m_file_path, ios::binary); if (!file) { cerr << "Failed to open file: " << m_file_path << endl; return; } // 读取文件到缓冲区中 file.read(m_buffer, m_buffer_size); if (!file) { cerr << "Failed to read file: " << m_file_path << endl; return; } m_read_size = static_cast<int>(file.gcount()); } int GetReadSize() const { return m_read_size; } private: const char* m_file_path; char* m_buffer; int m_buffer_size; int m_read_size = 0; }; // 上传vstor文件的线程任务类 class UploadTask : public Runnable { public: UploadTask(S3Client* s3_client, const char* buffer, int buffer_size) : m_s3_client(s3_client), m_buffer(buffer), m_buffer_size(buffer_size) {} void Run() override { Aws::StringStream sstream; sstream << "bytes=" << m_uploaded_size << "-" << (m_buffer_size - 1); Aws::String range_str = sstream.str(); // 构造上传请求 PutObjectRequest request; request.SetBucket(BUCKET_NAME); request.SetKey(OBJECT_KEY); request.SetBody(&(m_buffer[m_uploaded_size]), m_buffer_size - m_uploaded_size); request.SetContentLength(m_buffer_size - m_uploaded_size); request.SetContentRange(range_str); // 执行上传请求 auto outcome = m_s3_client->PutObject(request); if (!outcome.IsSuccess()) { cerr << "Failed to upload object: " << outcome.GetError().GetMessage() << endl; return; } m_uploaded_size = m_buffer_size; } private: S3Client* m_s3_client; const char* m_buffer; int m_buffer_size; int m_uploaded_size = 0; }; int main(int argc, char** argv) { if (argc != 2) { cerr << "Usage: " << argv[0] << " file_path" << endl; return 1; } // 初始化亚马逊SDK Aws::SDKOptions options; Aws::InitAPI(options); // 创建s3客户端 S3Client s3_client; // 创建线程池 ThreadPool thread_pool(4); // 读取vstor文件 const int BUFFER_SIZE = 1024 * 1024; // 缓冲区大小为1MB char buffer[BUFFER_SIZE]; FileReaderTask file_reader_task(argv[1], buffer, BUFFER_SIZE); thread_pool.SubmitRunnable(file_reader_task); file_reader_task.WaitUntilFinished(); // 上传vstor文件 int read_size = file_reader_task.GetReadSize(); for (int uploaded_size = 0; uploaded_size < read_size; ) { UploadTask upload_task(&s3_client, buffer, read_size); thread_pool.SubmitRunnable(upload_task); upload_task.WaitUntilFinished(); uploaded_size = upload_task.GetUploadedSize(); } // 关闭线程池 thread_pool.Shutdown(); // 关闭亚马逊SDK Aws::ShutdownAPI(options); return 0; } ``` 该示例代码中,首先使用C++亚马逊SDK线程池读取vstor文件到缓冲区中,然后使用线程池上传缓冲区中的数据到亚马逊s3存储桶中。上传过程中,将缓冲区分为若干段,每段使用一个线程来上传。当上传完一段数据后,再上传下一段数据,直至上传完整个缓冲区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值