2010-03-21 2 views
3

У меня есть необходимость хранить файлы на Amazon AWS S3, но для того, чтобы изолировать пользователя от аутентификации AWS Я хочу перейти через страницу ASP на моем сайте, в которую будет входить пользователь. Итак:Отправка файла из моего приложения (Indy/Delphi) на страницу ASP, а затем на другой сервер (Amazon S3)

Приложение отправляет файл с помощью библиотеки Delphi Indy библиотеки TidHTTP.Put (FileStream) на страницу ASP вместе с некоторыми материалами аутентификации (мои, а не AWS) в querystring.

Страница ASP проверяет данные авторизации, а затем, если OK сохраняет файл на S3, используя мою учетную запись Amazon.

У меня есть вопрос: как мне получить доступ к данным, поступающим из Indy PUT, используя JScript на странице ASP и передать его S3. Я в порядке с AWS подписанием, и т.д., это просто гайки и болты, соединяющие два бита (входящий запрос и запрос исходящего AWS) ...

ТИА R

+0

Посмотрите на метод Request.BinaryRead(). –

ответ

2

HTTP PUT будет сохранить файл в указанном месте в HTTP-заголовке - он «запрашивает, чтобы закрытый объект был сохранен в соответствии с предоставленным Request-URI».

Недостатком метода PUT является то, что если вы находитесь в среде совместного размещения, он может быть недоступен для вас.

Так что если веб-сервер поддерживает PUT, файл должен быть доступен в данном месте в (виртуальной) файловой системе. Запрос PUT будет обрабатываться на сервере, а не ASP:

В случае PUT, веб-сервер обрабатывает запрос самостоятельно: нет нет места для CGI или приложения ASP на шаг в. единственный способ для применения в захватить PUT, чтобы работать на уровне низкого уровня, ISAPI фильтра

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

вы уверены, что п eed PUT и не может использовать POST, который отправит файл URL-адресу, где ваш ASP-скрипт может прочитать его из потока запросов?

+0

Уверены ли вы в этом? У меня есть приложение ISAPI, которое отлично обрабатывает PUT. – Runner

+0

@Runner: ISAPI <> ASP - Я процитировал, что уровень фильтра ISAPI - единственный способ захватить PUT – mjn

0

ОК, Ive получил немного больше с этим. Код на конце 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 имеет то же значение, что и параметр потока, переданный в подпрограмму - то есть размер исходного файла.

Любые идеи?

POSTSCRIPT. Нашел проблему. Это поймало меня несколько раз с потоками, это одно. Когда вы пишете данные в поток, не забудьте снова сбросить позицию потока до нуля, прежде чем пытаться снова прочитать поток. То естькак раз перед линией:

XMLHttp.send (InputStream) ; 

мне нужно добавить:

InputStream.Position = 0 ; 

благодарность за интерес и предложения.

+0

, отметив, что вы можете принять свои собственные ответы, чтобы показать, что проблема решена успешно – mjn

 Смежные вопросы

  • Нет связанных вопросов^_^