2013-10-29 291 views
1

讓我解釋一下我的要求..上傳文件到Amazon S3

  1. 我想存儲上傳到我的應用程序(客戶端)到Amazon S3文件..
  2. 文件大小:約1-10 MB
  3. 但是,客戶端接口必須是我的應用程序提供的REST API 。因此,解析文件上傳(HTTP POST)請求後,我的應用程序必須將文件存儲在S3中。
  4. 因此,我必須在磁盤上傳到S3之前臨時存儲文件..

有沒有解決辦法?我可以刪除我的服務器上的臨時文件存儲..請讓我知道如果我不清楚..

編輯 - 可以從FileItem對象獲取字節數組並存儲它,而不是文件本身.. ?

回答

2

您的整個想法是爲了避免I/O?你不需要在上傳之前保存文件,你可以簡單地將字節數組發送到amazon 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