【问题标题】:Sending a file from my application (Indy/Delphi) to an ASP page and then onto another server (Amazon S3)将文件从我的应用程序 (Indy/Delphi) 发送到 ASP 页面,然后发送到另一台服务器 (Amazon S3)
【发布时间】:2010-03-21 08:29:28
【问题描述】:

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

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

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

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

TIA 回复

【问题讨论】:

  • 看一下Request.BinaryRead()方法。

标签: delphi asp-classic amazon-s3 indy


【解决方案1】:

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?

【讨论】:

  • 你确定吗?我有处理 PUT 的 ISAPI 应用程序。
  • @Runner: ISAPI ASP - 我提到 ISAPI 过滤器级别是捕获 PUT 的唯一方法
【解决方案2】:

好的,我对此有了更进一步的了解。 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 的值与传递给例程的流参数相同 - 即原始文件的大小。

有什么想法吗?

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

    XMLHttp.send (InputStream)  ; 

我需要补充:

   InputStream.Position = 0 ;

感谢您的关注和建议。

【讨论】:

  • 请注意,您可以接受自己的答案以表明问题已成功解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多