2010-03-21 3 views
3

Amazon AWS S3에 파일을 저장해야하지만 AWS 인증에서 사용자를 분리하려면 사용자가 로그인 할 내 사이트의 ASP 페이지를 통해 이동하려고합니다. 그래서 :내 응용 프로그램 (Indy/Delphi)에서 ASP 페이지로 그리고 다른 서버 (Amazon S3)로 파일 보내기

응용 프로그램은 쿼리 문자열에있는 일부 인증 항목 (광산이 아닌 AWS)과 함께 Delphi Indy 라이브러리 TidHTTP.Put (FileStream) 루틴을 사용하여 ASP 페이지에 파일을 보냅니다.

ASP 페이지는 인증 세부 정보를 확인한 다음 OK가 내 Amazon 계정을 사용하여 S3에 파일을 저장하는지 확인합니다.

문제 : ASP 페이지에서 JScript를 사용하여 Indy PUT에서 들어오는 데이터에 액세스하고 S3에 전달하는 방법은 무엇입니까? 내가 AWS 서명 등으로 확인 해요, 그것은

+0

Request.BinaryRead() 메소드를 살펴보십시오. –

답변

2

HTTP PUT 것이다

TIA R ... 그냥 너트와 두 개의 비트 (들어오는 요청과 나가는 AWS 요청)를 연결하는 볼트의 파일을 HTTP 헤더의 지정된 위치에 저장합니다. "제공된 엔티티가 제공된 Request-URI로 저장되도록 요청합니다."

PUT 방법의 단점은 공유 호스팅 환경에서 사용할 수없는 경우 일 수 있다는 것입니다.

웹 서버가 PUT을 지원하는 경우 (가상) 파일 시스템의 지정된 위치에서 파일을 사용할 수 있어야합니다. 풋 요청은 서버가 아닌 ASP가 취급 될 것이다

PUT의 경우

가 웹 서버 요청 자체를 처리 : 은 CGI 나에 단계 ASP 애플리케이션 여지가 없다. 캡처 풋에 응용 프로그램을위한 유일한 방법은

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

당신이 N 확인하는 낮은 수준, ISAPI 필터 수준에서 작동하는 것입니다 eed PUT을 사용하고 POST를 사용할 수 없습니다. POST를 사용하면 ASP 스크립트가 요청 스트림에서 읽을 수있는 URL로 파일을 보냅니다.

+0

정말이에요? 나는 PUT을 잘 처리하는 ISAPI 앱을 가지고있다. – Runner

+0

@Runner : ISAPI <> ASP - ISAPI 필터 수준이 PUT을 캡처 할 수있는 유일한 방법이라고 언급했습니다. – mjn

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를 사용하여 이진 스트림에 씁니다. 스트림의 크기를 출력하면 응용 프로그램에서 POST로 처리 한 파일의 크기가 표시되므로 데이터가 어딘가에 있다고 생각할 수 있습니다. 그런 다음 AWS 인증/서명을 설정하고 PUT을 수행하는 루틴 (매개 변수로 스트림 사용)을 호출합니다.

AWS 호출은 오류를 반환하지 않으며 올바른 이름의 파일이 올바른 위치에 만들어 지지만 크기는 0입니다! InputStream.Size는 루틴에 전달 된 스트림 매개 변수와 동일한 값, 즉 원본 파일의 크기를가집니다.

아이디어가 있으십니까?

POSTSCRIPT. 문제를 찾았습니다. 시냇물로 몇 번 잡았어. 이거. 스트림에 데이터를 쓰는 경우 스트림에서 다시 읽으려고 시도하기 전에 스트림 위치를 다시 0으로 재설정하는 것을 잊지 마십시오. 나는.바로 줄 앞에 :

XMLHttp.send (InputStream) ; 

내가 추가 할 필요 : 관심과 제안을

InputStream.Position = 0 ; 

내 감사합니다.

+0

문제가 성공적으로 해결되었음을 나타 내기 위해 자신의 대답을 수락 할 수 있습니다. – mjn

관련 문제