无法上传文件到aws s3 asp.net

问题描述 投票:0回答:1
 fileTransferUtility = new TransferUtility(s3Client);
        try
        {
            if (file.ContentLength > 0)
            {
                var filePath = Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName));
                var fileTransferUtilityRequest = new TransferUtilityUploadRequest
                {
                    BucketName = bucketName,
                    FilePath = filePath,
                    StorageClass = S3StorageClass.StandardInfrequentAccess,
                    PartSize = 6291456, // 6 MB.  
                    Key = keyName,
                    CannedACL = S3CannedACL.PublicRead
                };
                fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
                fileTransferUtilityRequest.Metadata.Add("param2", "Value2");
                fileTransferUtility.Upload(fileTransferUtilityRequest);
                fileTransferUtility.Dispose();
            }

我得到这个错误FilePath属性显示的文件不存在!我试着把文件的实际路径改成C:/Users/jojo/Downloads,但还是得到同样的错误。

我试着把文件的实际路径改为C:\Users\jojo\Downloads,但还是得到同样的错误。

amazon-web-services amazon-s3
1个回答
1
投票

(基于上面的评论,表明 file 是一个实例 HttpPostedFileBase 在网络应用中...)

我不知道你从哪里得到 Server.MapPath("~/Files") 从,但如果 file 是一个 HttpPostedFileBase 已经上传到这个网络应用程序的代码,那么它很可能在内存中,而不是在你的文件系统中。 或者最好是在文件系统中的某个临时系统文件夹中。

由于你的源码(即 file 变量内容)是一个流,在你尝试与文件系统交互之前,你应该看看你使用的AWS API是否可以接受一个流。 而现在看来是可以的。

if (file.ContentLength > 0)
{
    var transferUtility = new TransferUtility(/* constructor params here */);
    transferUtility.Upload(file.InputStream, bucketName, keyName);
}

注意,这完全是自由发挥,我对AWS的交互并不熟悉。 而且你一定要看一下在 TransferUtility 来看看哪个符合你的设计。 但问题是,你目前要上传的是一个 溪流 从您已经上传到您的Web应用程序的文件。 寻找从文件系统上传一个实际的文件。


作为后备方案,如果你不能让流上传工作(你真的应该这样做,这是这里的理想方法),那么你的下一个选择很可能是先保存文件,然后用你现在的方法上传。 所以,如果你希望它在 Server.MapPath("~/Files") 那么你就需要先把它保存到那个文件夹里,比如说。

file.SaveAs(Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName)));

当然,随着时间的推移,这个文件夹可能会变得很满,你可能会想把它清理掉。

© www.soinside.com 2019 - 2024. All rights reserved.