Stack Overflow上有很多类似的问题,但是我无法通过MVC.net将大文件上传到S3。
基于aws .net sdk示例和其他一些答案,我有以下内容:
public static void UploadToS3(System.IO.Stream stream, string bucketName, string keyName, bool asAttachement)
{
AmazonS3 client;
string accessKey = Settings.ApplicationSettings.AccessKeyID;
string secretKey = Settings.ApplicationSettings.SecretAccessKeyID;
// This config ensures s3 works in medium trust.
AmazonS3Config s3config = new AmazonS3Config();
s3config.UseSecureStringForAwsSecretKey = false;
using (client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, s3config))
{
try
{
PutObjectRequest request = new PutObjectRequest();
request.WithBucketName(bucketName)
.WithKey(keyName)
.WithInputStream(stream);
if (asAttachement)
{
// add headers to ensure asset is downloaded, not opened in browser.
request.AddHeaders(Amazon.S3.Util.AmazonS3Util.CreateHeaderEntry("Content-Disposition", "attachment"));
}
S3Response response = client.PutObject(request);
response.Dispose();
}
catch(Exception ex)
{
throw new ApplicationException("Unable to upload asset." + ex.Message);
}
}
}
Web应用程序与小文件完美配合,大型文件将上传到站点(托管Rackspace Cloud Sites),但浏览器在http帖子后大约30秒后超时,这不足以上传流到亚马逊。浏览器因未收到服务器的响应而超时。
我需要做些什么来使这个工作适用于大文件,或者我应该如何将文件上传到S3?
答案 0 :(得分:1)
从它的声音来看,你有3个系统参与其中。有一个运行Web浏览器的客户端,有您的服务器,还有S3。据我了解您的情况,客户端向您的服务器发出请求,导致您的服务器将文件上传到S3。你提到浏览器抱怨服务器没有响应。这可能是因为您的服务器忙于将文件上传到S3。当您的服务器将对象上载到S3时,它不会向浏览器发送任何状态更新。如果上传时间足够长,浏览器将放弃等待。这并不意味着上传没有发生,只是浏览器停止等待服务器响应。您需要做的是将一些增量结果返回给客户端。我不是.Net程序员,但我可能会做的是生成一个新线程来执行上传,并在请求线程上返回一些初始内容,指示请求正在进行,刷新响应但不关闭输出。当有一个等待上传线程的循环时,每隔5秒唤醒一次以写入空格字符并将其刷新到客户端。这将使浏览器不会超时。