3

我需要在 Amazon AWS S3 上存储文件,但为了将用户与 AWS 身份验证隔离开来,我想通过我网站上的 ASP 页面进行访问,用户将登录该页面。所以:

应用程序使用 Delphi Indy 库 TidHTTP.Put (FileStream) 例程将文件连同查询字符串上的一些身份验证内容(我的,不是 AWS)一起发送到 ASP 页面。

ASP 页面检查身份验证详细信息,然后如果确定,则使用我的 Amazon 帐户将文件存储在 S3 上。

我遇到的问题是:如何在 ASP 页面中使用 JScript 访问来自 Indy PUT 的数据并将其传递给 S3。我对 AWS 签名等没问题,这只是连接这两个位(传入请求和传出 AWS 请求)的具体细节......

TIA R

4

2 回答 2

2

HTTP PUT会将文件存储在HTTP 标头中的给定位置 - 它“请求将封闭的实体存储在提供的 Request-URI 下”。

PUT 方法的缺点是,如果您在共享主机环境中,您可能无法使用它。

因此,如果 Web 服务器支持 PUT,则该文件应该在(虚拟)文件系统中的给定位置可用。PUT 请求将由服务器而不是 ASP 处理:

在 PUT 的情况下,Web 服务器自己处理请求:没有空间让 CGI 或 ASP 应用程序介入。应用程序捕获 PUT 的唯一方法是在低级别的 ISAPI 过滤器级别上操作

http://www.15seconds.com/issue/981120.htm

您确定需要 PUT 并且不能使用 POST,它将文件发送到您的 ASP 脚本可以从请求流中读取它的 URL?

于 2010-03-21T10:39:41.980 回答
0

好的,我对此有更进一步的了解。ASP端的代码是:

    var PostedDataSize   = Request.TotalBytes ;
    var PostedData       = Request.BinaryRead (PostedDataSize) ;

    var PostedDataStream = Server.CreateObject ("ADODB.Stream") ; 
    PostedDataStream.Open ;
    PostedDataStream.Type = 1 ;                    // binary
    PostedDataStream.Write (PostedData) ;

    Response.Write ("PostedDataStream.Size = " + PostedDataStream.Size + "<br>") ;

    var XML = AmazonAWSPUTRequest (BucketName, AWSDestinationFileID, PostedDataStream) ;
    .....

    function AmazonAWSPUTRequest (Bucket, Filename, InputStream) 

    {
    ....
    XMLHttp.open ("PUT", URL + FRequest, false) ;

    XMLHttp.setRequestHeader (....
    XMLHttp.setRequestHeader (....
    ...
    Response.Write ("InputStream.Size = " + InputStream.Size + "<br>") ;
    XMLHttp.send (InputStream)  ;     

所以我使用 BinaryRead,将其写入二进制流。如果我写出流的大小,我会从我的应用程序中获得我发布的文件的大小,所以我认为数据在某处。然后我调用一个例程(以流作为参数)设置 AWS 身份验证/签名并执行 PUT。

AWS 调用没有返回错误,并且在正确的位置创建了一个正确名称的文件,但它的大小为零!InputStream.Size 具有与传递给例程的流参数相同的值——即原始文件的大小。

有任何想法吗?

后记。发现了问题。有几次我被溪流抓住了,这个。当您将数据写入流时,不要忘记在再次尝试从流中读取之前将流位置重置为零。即就在行之前:

    XMLHttp.send (InputStream)  ; 

我需要补充:

   InputStream.Position = 0 ;

我感谢您的兴趣和建议。

于 2010-03-21T20:35:21.883 回答