【问题标题】:Upload File to Amazon S3将文件上传到 Amazon S3
【发布时间】:2016-02-29 21:22:59
【问题描述】:

让我解释一下我的要求..

  1. 我想将上传到我的应用程序(由客户端)的文件存储到 Amazon S3..
  2. 文件大小 ~ 1-10 MB
  3. 但是,客户端接口必须是 REST API 由我的应用程序提供。因此,在解析文件上传 (HTTP POST) 请求后,我的应用程序必须将文件存储在 S3 中。
  4. 因此,我必须先将文件临时存储在磁盘上,然后再上传到 S3..

有解决方法吗?我可以取消服务器上的临时文件存储吗?如果我不清楚,请告诉我。

编辑 - 从 FileItem 对象获取字节数组并存储它而不是文件本身是否可以..?

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    您的整个想法是避免 I/O 对吗?您不需要在上传之前保存文件,您可以简单地将字节数组发送到亚马逊 REST API。

    这是我上传和下载的示例 VB.NET 代码:

    Imports System.Collections.Generic
    Imports System.IO
    Imports System.Linq
    Imports System.Net
    Imports System.Security.Cryptography
    Imports System.Text
    Imports System.Threading.Tasks
    Module Module1
      Sub Main()
        Dim obj As New Program
        obj.UploadFile()
        'obj.DownloadFile() 'Download Example
      End Sub
    End Module
    
    Class Program
      Private Const KeyId As String = "yourkey"
      Private Const AccessKey As String = "your/access"
      Private Const S3Url As String = "https://s3.amazonaws.com/"
    
      Public Sub DownloadFile()
    
        Dim bucketName As String = "yourbucket"
        Dim FileName As String = "file.png"
        Dim timeStamp As String = String.Format("{0:r}", DateTime.UtcNow)
        Dim stringToConvert As String = Convert.ToString((Convert.ToString((Convert.ToString("GET" & vbLf + vbLf + vbLf + vbLf + "x-amz-date:") & timeStamp) + vbLf + "/") & bucketName) + "/") & FileName
    
        Dim ae = New UTF8Encoding()
        Dim signature = New HMACSHA1() With { _
           .Key = ae.GetBytes(AccessKey) _
        }
        Dim bytes = ae.GetBytes(stringToConvert)
        Dim moreBytes = signature.ComputeHash(bytes)
        Dim encodedCanonical = Convert.ToBase64String(moreBytes)
    
        ' Send the request
        Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create(Convert.ToString((Convert.ToString("https://") & bucketName) + ".s3.amazonaws.com" + "/") & FileName), HttpWebRequest)
        'request.ContentType = "application/octet-stream";
        request.Headers.Add("x-amz-date", timeStamp)
        request.Headers.Add("Authorization", "AWS " + KeyId + ":" + encodedCanonical)
        request.Method = "GET"
    
        ' Get the response
        Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        Dim ReceiveStream As Stream = response.GetResponseStream()
    
        Console.WriteLine(response.StatusCode)
      End Sub
    
      Public Sub UploadFile()
        Dim fileData = File.ReadAllBytes("C:\file.png")
    
        Dim timeStamp As String = String.Format("{0:r}", DateTime.UtcNow)
    
        Dim stringToConvert As String = (Convert.ToString("PUT" & vbLf + vbLf + "application/octet-stream" & vbLf + vbLf + "x-amz-acl:public-read" + vbLf + "x-amz-date:") & timeStamp) + vbLf + "/celso711/file.png"
        'resource
        Dim ae = New UTF8Encoding()
        Dim signature = New HMACSHA1() With { _
          .Key = ae.GetBytes(AccessKey) _
        }
        Dim bytes = ae.GetBytes(stringToConvert)
        Dim moreBytes = signature.ComputeHash(bytes)
        Dim encodedCanonical = Convert.ToBase64String(moreBytes)
    
        Dim url = "https://bucket.s3.amazonaws.com/file.png"
    
        Dim request = TryCast(WebRequest.Create(url), HttpWebRequest)
        request.Method = "PUT"
        request.Headers("x-amz-date") = timeStamp
        request.Headers("x-amz-acl") = "public-read"
        request.ContentType = "application/octet-stream"
        request.ContentLength = fileData.Length
        request.Headers("Authorization") = (Convert.ToString("AWS ") & KeyId) + ":" + encodedCanonical
    
        Dim requestStream = request.GetRequestStream()
        requestStream.Write(fileData, 0, fileData.Length)
        requestStream.Close()
    
        Using response = TryCast(request.GetResponse(), HttpWebResponse)
          Dim reader = New StreamReader(response.GetResponseStream())
          Dim data = reader.ReadToEnd()
        End Using
      End Sub
    End Class
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2013-09-09
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2011-07-21
      • 2014-05-01
      • 2018-10-09
      相关资源
      最近更新 更多