C# 将文件上载到AmazonS3存储桶
我知道有很多这样的线程,我尝试了100个示例,它们都抛出相同的异常: 指定的存储桶无效 我联系了s3管理员,他说,他这边的一切都是正确的,他说,他设置了完全权限,没有拒绝声明,所以我们可以测试, 但是我的应用程序仍然抛出相同的异常,下面是代码C# 将文件上载到AmazonS3存储桶,c#,.net,amazon-web-services,amazon-s3,C#,.net,Amazon Web Services,Amazon S3,我知道有很多这样的线程,我尝试了100个示例,它们都抛出相同的异常: 指定的存储桶无效 我联系了s3管理员,他说,他这边的一切都是正确的,他说,他设置了完全权限,没有拒绝声明,所以我们可以测试, 但是我的应用程序仍然抛出相同的异常,下面是代码 using Amazon; using Amazon.S3; using Amazon.S3.Transfer; namespace AmazonS3 { public class FileUploader { priva
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
namespace AmazonS3
{
public class FileUploader
{
private const string S3_Bucket_ARN = "(hidden)";
private const string IAM_User_ARN = "(hidden)";
private const string Access_Key_ID = "(hidden)";
private const string Secret_access_Key = "(hidden)";
public void UploadFile(string Filepath)
{
Program.WriteLine(MessageStatus.Neutral, "[1/4] Connecting to Amazon S3 . . .");
using (IAmazonS3 client = new AmazonS3Client(Access_Key_ID, Secret_access_Key, RegionEndpoint.USEast1))
{
Program.WriteLine(MessageStatus.Neutral, "[2/4] Preparing upload request . . .");
var uploadRequest = new TransferUtilityUploadRequest
{
FilePath = Filepath,
BucketName = S3_Bucket_ARN,
CannedACL = S3CannedACL.PublicRead
};
Program.WriteLine(MessageStatus.Neutral, $"[3/4] Uploading file: \"{Filepath}\" . . .");
var fileTransferUtility = new TransferUtility(client);
fileTransferUtility.Upload(uploadRequest);
Program.WriteLine(MessageStatus.Neutral, $"[4/4] File: \"{Filepath}\" successfully uploaded.");
}
}
}
}
隐藏的字符串当然被我的真实凭证所取代,我现在刚刚编辑了它们。
不管怎样,这里有什么不正确的地方?我已经被困了好几天了,提前谢谢。我最近使用了下面的方法,它可能会有所帮助
private string UploadAWS(Stream stream, string contentType, string name,string orgfileName,string lable)
{
string accessKey = "xxxxx";
string secretKey = "xxxxxxx";
using (client = new AmazonS3Client(accessKey, secretKey, Amazon.RegionEndpoint.USEast1))
{
return WritingAnObject(stream, contentType, name, orgfileName,lable);
}
}
private string WritingAnObject(Stream stream, string contentType, string name,string orgfileName,string lable)
{
string rtn = string.Empty;
try
{
string bucketName = "xxxxxxxx";
PutObjectRequest putRequest2 = new PutObjectRequest
{
BucketName = bucketName,
Key = name,
ContentType = contentType,
InputStream = stream
};
putRequest2.Metadata.Add("x-amz-meta-title", lable);
putRequest2.Metadata.Add("x-amz-meta-original-file-name", orgfileName);
PutObjectResponse response2 = client.PutObject(putRequest2);
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
||
amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
rtn="Check the provided AWS Credentials.";
}
else
{
rtn="Error occurred. Message:"+ amazonS3Exception.Message + " when writing an object";
}
}
return rtn;
}
我最近使用了下面的方法,可能会有所帮助
private string UploadAWS(Stream stream, string contentType, string name,string orgfileName,string lable)
{
string accessKey = "xxxxx";
string secretKey = "xxxxxxx";
using (client = new AmazonS3Client(accessKey, secretKey, Amazon.RegionEndpoint.USEast1))
{
return WritingAnObject(stream, contentType, name, orgfileName,lable);
}
}
private string WritingAnObject(Stream stream, string contentType, string name,string orgfileName,string lable)
{
string rtn = string.Empty;
try
{
string bucketName = "xxxxxxxx";
PutObjectRequest putRequest2 = new PutObjectRequest
{
BucketName = bucketName,
Key = name,
ContentType = contentType,
InputStream = stream
};
putRequest2.Metadata.Add("x-amz-meta-title", lable);
putRequest2.Metadata.Add("x-amz-meta-original-file-name", orgfileName);
PutObjectResponse response2 = client.PutObject(putRequest2);
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
||
amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
rtn="Check the provided AWS Credentials.";
}
else
{
rtn="Error occurred. Message:"+ amazonS3Exception.Message + " when writing an object";
}
}
return rtn;
}
问题在于:
BucketName = S3_Bucket_ARN
ARN是,它是唯一标识Amazon资源的名称空间。。。但是在这种情况下,BucketName
只需要bucket的实际名称,例如my example bucket
如果使用的是bucket ARN,则传递的值类似于ARN:aws:s3:::my example bucket
,它不仅是bucket名称,而且还包含在bucket名称中无效的字符(:
)
指示当bucket名称不正确时可能出现两种不同的错误:
InvalidBucketName |指定的存储桶无效。
NoSuchBucket |指定的bucket不存在。
第一个表示bucket名称包含无效字符。问题在于:
BucketName = S3_Bucket_ARN
ARN是,它是唯一标识Amazon资源的名称空间。。。但是在这种情况下,BucketName
只需要bucket的实际名称,例如my example bucket
如果使用的是bucket ARN,则传递的值类似于ARN:aws:s3:::my example bucket
,它不仅是bucket名称,而且还包含在bucket名称中无效的字符(:
)
指示当bucket名称不正确时可能出现两种不同的错误:
InvalidBucketName |指定的存储桶无效。
NoSuchBucket |指定的bucket不存在。
第一个表示bucket名称包含无效字符。如果所有100个示例都抛出相同的错误,那么您的bucket可能无效?你绝对确定你使用了正确的详细信息吗?是的,这是我第一次想到的,但是s3管理员给我发送了那些凭据,即使在那之后,我们再次检查,凭据是正确的:/n也许您的bucket名称有错误。您的bucket名称有问题。我敢打赌问题在于
BucketName=S3\u bucket\ARN
BucketName
需要一个bucket名称,而不是ARN。在这里使用类似于arn:aws:s3:…
的值肯定是无效的。如果所有100个示例都抛出相同的错误,那么您的bucket可能是无效的?你绝对确定你使用了正确的详细信息吗?是的,这是我第一次想到的,但是s3管理员给我发送了那些凭据,即使在那之后,我们再次检查,凭据是正确的:/n也许您的bucket名称有错误。您的bucket名称有问题。我敢打赌问题在于BucketName=S3\u bucket\ARN
BucketName
需要一个bucket名称,而不是ARN。在此处使用类似于arn:aws:s3:…
的值肯定是无效的。再次引发相同的异常:/但是感谢您的帮助Gain引发相同的异常:/但是感谢您的帮助