使用Delphi将文件上传到Amazon S3(Upload files to Amazon S3 with Delphi)

编程入门 行业动态 更新时间:2024-10-28 14:25:57
使用Delphi将文件上传到Amazon S3(Upload files to Amazon S3 with Delphi)

使用我在另一个主题中找到的代码。 虽然accessKeyID和secretAccessKey验证正确,但我在验证时总会遇到签名不匹配。 存储端点对于存储桶也是正确的。 使用Delphi 10 Seattle。 CloudComponents可能与该地区或(当地)时间有问题吗?

Function Amazon_Upload (fileName, bucket, accessKeyID, secretAccessKey : String) : TCallResult; var Service: TAmazonStorageService; ConAmazon: TAmazonConnectionInfo; info : TCloudResponseInfo; upload_stream : TFileStream; bytes : TBytes; begin // create file upload_stream := TFileStream.Create(fileName,fmOpenRead); try // filestream to tBytes upload_stream.Position := 0; SetLength(bytes, upload_stream.Size); upload_stream.Write(bytes[0], upload_stream.Size); ConAmazon := TAmazonConnectionInfo.Create(nil); try // amazon connection parameters ConAmazon.AccountKey := secretAccessKey; ConAmazon.AccountName := accessKeyID; ConAmazon.QueueEndpoint := 'queue.amazonaws.com'; ConAmazon.StorageEndpoint := 's3-eu-central-1.amazonaws.com'; ConAmazon.TableEndpoint := 'sdb.amazonaws.com'; ConAmazon.UseDefaultEndpoints := False; // storage objects info := TCloudResponseInfo.Create; Service := TAmazonStorageService.Create(ConAmazon); try // upload document to storage Service.UploadObject(Bucket, fileName, bytes, TRUE, nil, nil, amzbaPrivate, info); // get results Result.Callstatus := info.StatusCode; Result.Success := info.StatusCode in [Ord(rrOK),ord(rrCreated),ord(rrNoContent)]; Result.Response := TJSONObject.ParseJSONValue(info.StatusMessage); If Assigned(OnLog) Then FOnlog(info.StatusCode, ConAmazon.StorageEndpoint + #13#10 + bucket + #13#10 + accessKeyID + #13#10 + secretAccessKey, info.StatusMessage, ''); finally info.Free; Service.Free; end; finally ConAmazon.Free; end; finally upload_stream.Free; end; end;

using code I found in another topic. I'm always getting a signature mismatch when authenticating, although accessKeyID and secretAccessKey are verified correct. Also the storage endpoint is correct for the bucket. Using Delphi 10 Seattle. Possible that the CloudComponents have a problem with the region or (local) time ?

Function Amazon_Upload (fileName, bucket, accessKeyID, secretAccessKey : String) : TCallResult; var Service: TAmazonStorageService; ConAmazon: TAmazonConnectionInfo; info : TCloudResponseInfo; upload_stream : TFileStream; bytes : TBytes; begin // create file upload_stream := TFileStream.Create(fileName,fmOpenRead); try // filestream to tBytes upload_stream.Position := 0; SetLength(bytes, upload_stream.Size); upload_stream.Write(bytes[0], upload_stream.Size); ConAmazon := TAmazonConnectionInfo.Create(nil); try // amazon connection parameters ConAmazon.AccountKey := secretAccessKey; ConAmazon.AccountName := accessKeyID; ConAmazon.QueueEndpoint := 'queue.amazonaws.com'; ConAmazon.StorageEndpoint := 's3-eu-central-1.amazonaws.com'; ConAmazon.TableEndpoint := 'sdb.amazonaws.com'; ConAmazon.UseDefaultEndpoints := False; // storage objects info := TCloudResponseInfo.Create; Service := TAmazonStorageService.Create(ConAmazon); try // upload document to storage Service.UploadObject(Bucket, fileName, bytes, TRUE, nil, nil, amzbaPrivate, info); // get results Result.Callstatus := info.StatusCode; Result.Success := info.StatusCode in [Ord(rrOK),ord(rrCreated),ord(rrNoContent)]; Result.Response := TJSONObject.ParseJSONValue(info.StatusMessage); If Assigned(OnLog) Then FOnlog(info.StatusCode, ConAmazon.StorageEndpoint + #13#10 + bucket + #13#10 + accessKeyID + #13#10 + secretAccessKey, info.StatusMessage, ''); finally info.Free; Service.Free; end; finally ConAmazon.Free; end; finally upload_stream.Free; end; end;

最满意答案

我稍微修改了您的代码以使用TBytesStream而不是TFileStream来设置TBytes缓冲区上的文件内容。 你必须阅读流,而不是写它。

现在它不会破坏它的内容。

Function Amazon_Upload (fileName, bucket, accessKeyID, secretAccessKey: String) : TCallResult; var Service: TAmazonStorageService; ConAmazon: TAmazonConnectionInfo; info : TCloudResponseInfo; upload_stream : TBytesStream; bytes : TBytes; begin // create file upload_stream := TBytesStream.Create; upload_stream.LoadFromFile(filename); try // filestream to tBytes upload_stream.Position := 0; SetLength(bytes, upload_stream.Size); upload_stream.ReadBuffer(bytes, upload_stream.Size); ConAmazon := TAmazonConnectionInfo.Create(nil); try // amazon connection parameters ConAmazon.AccountKey := secretAccessKey; ConAmazon.AccountName := accessKeyID; ConAmazon.QueueEndpoint := 'queue.amazonaws.com'; ConAmazon.StorageEndpoint := 's3-eu-central-1.amazonaws.com'; ConAmazon.TableEndpoint := 'sdb.amazonaws.com'; ConAmazon.UseDefaultEndpoints := False; // storage objects info := TCloudResponseInfo.Create; Service := TAmazonStorageService.Create(ConAmazon); try // upload document to storage Service.UploadObject(Bucket, ExtractFileName(fileName), bytes, TRUE, nil, nil, amzbaPrivate, info); // get results Result.Callstatus := info.StatusCode; Result.Success := info.StatusCode in [Ord(rrOK),ord(rrCreated),ord(rrNoContent)]; Result.Response := TJSONObject.ParseJSONValue(info.StatusMessage); If Assigned(OnLog) Then FOnlog(info.StatusCode, ConAmazon.StorageEndpoint + #13#10 + bucket + #13#10 + accessKeyID + #13#10 + secretAccessKey, info.StatusMessage, ''); finally info.Free; Service.Free; end; finally ConAmazon.Free; end; finally upload_stream.Free; end; end;

I have modified slightly your code to use a TBytesStream instead of a TFileStream to set the file content on a TBytes buffer. And you have to read the stream, not write it.

Now it doesn't corrupt its content.

Function Amazon_Upload (fileName, bucket, accessKeyID, secretAccessKey: String) : TCallResult; var Service: TAmazonStorageService; ConAmazon: TAmazonConnectionInfo; info : TCloudResponseInfo; upload_stream : TBytesStream; bytes : TBytes; begin // create file upload_stream := TBytesStream.Create; upload_stream.LoadFromFile(filename); try // filestream to tBytes upload_stream.Position := 0; SetLength(bytes, upload_stream.Size); upload_stream.ReadBuffer(bytes, upload_stream.Size); ConAmazon := TAmazonConnectionInfo.Create(nil); try // amazon connection parameters ConAmazon.AccountKey := secretAccessKey; ConAmazon.AccountName := accessKeyID; ConAmazon.QueueEndpoint := 'queue.amazonaws.com'; ConAmazon.StorageEndpoint := 's3-eu-central-1.amazonaws.com'; ConAmazon.TableEndpoint := 'sdb.amazonaws.com'; ConAmazon.UseDefaultEndpoints := False; // storage objects info := TCloudResponseInfo.Create; Service := TAmazonStorageService.Create(ConAmazon); try // upload document to storage Service.UploadObject(Bucket, ExtractFileName(fileName), bytes, TRUE, nil, nil, amzbaPrivate, info); // get results Result.Callstatus := info.StatusCode; Result.Success := info.StatusCode in [Ord(rrOK),ord(rrCreated),ord(rrNoContent)]; Result.Response := TJSONObject.ParseJSONValue(info.StatusMessage); If Assigned(OnLog) Then FOnlog(info.StatusCode, ConAmazon.StorageEndpoint + #13#10 + bucket + #13#10 + accessKeyID + #13#10 + secretAccessKey, info.StatusMessage, ''); finally info.Free; Service.Free; end; finally ConAmazon.Free; end; finally upload_stream.Free; end; end;

更多推荐

本文发布于:2023-08-02 16:28:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1378989.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件上传   Amazon   Delphi   files   Upload

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!