3

Amazon AWS S3 にファイルを保存する必要がありますが、AWS 認証からユーザーを分離するために、ユーザーがログインする自分のサイトの ASP ページを経由したいと考えています。そう:

アプリケーションは、Delphi Indy ライブラリの TidHTTP.Put (FileStream) ルーチンを使用してファイルを ASP ページに送信し、クエリ文字列にいくつかの認証情報 (AWS ではなく私のもの) を付けます。

ASP ページは認証の詳細を確認し、OK の場合は Amazon アカウントを使用して S3 にファイルを保存します。

問題は、ASP ページで JScript を使用して Indy PUT から入ってくるデータにアクセスし、それを S3 に渡す方法です。私はAWS署名などでOKです.2つのビット(着信リクエストと発信AWSリクエスト)を接続するための基本的なことです...

ティア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を使用できないことを確認します。POSTは、ASPスクリプトがリクエストストリームからファイルを読み取ることができるURLにファイルを送信します。

于 2010-03-21T10:39:41.980 に答える
0

OK、これでもう少し進んだ。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を使用して、バイナリストリームに書き込みます。ストリームのサイズを書き出すと、アプリケーションからPOSTしたファイルのサイズを取得するので、データはどこかにあると思います。次に、AWS認証/署名を設定してPUTを実行するルーチン(パラメーターとしてストリームを使用)を呼び出します。

AWS呼び出しはエラーを返さず、正しい名前のファイルが適切な場所に作成されますが、サイズはゼロです。InputStream.Sizeの値は、ルーチンに渡されるストリームパラメーターと同じです。つまり、元のファイルのサイズです。

何か案は?

追記。問題が見つかりました。これは、ストリームで何度か私を捕まえました。ストリームにデータを書き込むときは、ストリームからの読み取りを再試行する前に、ストリームの位置をゼロにリセットすることを忘れないでください。つまり、行の直前:

    XMLHttp.send (InputStream)  ; 

追加する必要がありました:

   InputStream.Position = 0 ;

関心と提案に感謝します。

于 2010-03-21T20:35:21.883 に答える