上传大小超过3 GB的亚马逊S3上的文件

时间:2015-04-15 09:11:56

标签: javascript jquery asp.net asp.net-mvc amazon-s3

我正在尝试将大小超过3 GB的文件上传到亚马逊当我上传大小很小的文件时,他们会愉快地上传 但是当我尝试上传大文件时,它会显示错误http 400

任何人都可以告诉我哪里出错或者我需要上传文件。 提前谢谢

  public bool UploadFileDicom(HttpPostedFileBase file)
    {
        bool isSuccess = false;
        try
        {
            string bucketName = Convert.ToString(WebConfigurationManager.AppSettings["iqcDicomBucket"]);
            client = new AmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY, Amazon.RegionEndpoint.USWest2);
            var request = new PutObjectRequest()
            {
                BucketName = bucketName,
                CannedACL = S3CannedACL.PublicRead,//PERMISSION TO FILE PUBLIC ACCESIBLE
                Key = file.FileName,
                InputStream = file.InputStream//SEND THE FILE STREAM

            };
            client.PutObject(request);
            isSuccess = true;

        }
        catch (Exception ex)
        {
            logger.Error(DateTime.Now + "Error in GlobalComman.cs, CreateDocStatus_TraningAndValidation function: " + ex.Message);
            throw ex;

        }
        return isSuccess;
    }

3 个答案:

答案 0 :(得分:1)

结帐this lib。它以可配置大小的块上传文件。由于您的要求是在浏览器中完成,这应该可行。

答案 1 :(得分:0)

首先,您不允许上传超过5GB的文件( 6gb MUST FAIL,但不是2gb文件):

但上传大文件可能会出现各种问题,因此,为避免单一上传出现问题,建议分段上传

  

上传部分对象 - 使用Multipart upload API,您可以上传大型对象,最高可达5 TB。

Multipart Upload API旨在改善较大对象的上传体验。您可以上传部分对象。这些对象部分可以独立,任意顺序和并行上载。您可以将Multipart Upload用于大小为5 MB到5 TB的对象。有关更多信息,请参阅使用分段上传上载对象。有关更多信息,请参阅使用分段上传API上传对象。

Check here 以下Java代码示例将文件IN PARTS上载到Amazon S3存储桶:

public class UploadObjectMultipartUploadUsingHighLevelAPI {

    public static void main(String[] args) throws Exception {
        String existingBucketName = "*** Provide existing bucket name ***";
        String keyName            = "*** Provide object key ***";
        String filePath           = "*** Path to and name of the file to upload ***";  

        TransferManager tm = new TransferManager(new ProfileCredentialsProvider());        
        System.out.println("Hello");
        // TransferManager processes all transfers asynchronously, 
        // so this call will return immediately.
        Upload upload = tm.upload(
                existingBucketName, keyName, new File(filePath));
        System.out.println("Hello2");

        try {
            // Or you can block and wait for the upload to finish
            upload.waitForCompletion();
            System.out.println("Upload complete.");
        } catch (AmazonClientException amazonClientException) {
            System.out.println("Unable to upload file, upload was aborted.");
            amazonClientException.printStackTrace();
        }
    }
}

答案 2 :(得分:0)

@JordiCastilla关于S3 multipart和5GB阈值是正确的......但你的第一个问题是本地问题:

maxRequestLength="2147482624" 

嗯。这大概是2 GiB。所以,当你说你的控制器没有触发时,这表明你的400错误甚至不是来自S3的问题所暗示的。您的本地配置导致浏览器的请求在飞行中被取消,因为它比您的本地配置允许的大。

您的第一步似乎是增加此配置值,请记住,当您跨越5GB阈值时,您随后还需要转换为分段上传到.3。

另外请记住,正在进行的请求也占用了服务器上的临时磁盘空间,因此将此值设置为已经很大(更不用说将其设置得更大)会让您面临风险拒绝服务攻击,虚假请求可能会耗尽您的临时空间来禁用您的站点。