使用我在另一个主题中找到的代码。 虽然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;更多推荐
发布评论