HTTP-сервер загрузки изображений Delphi

В моем приложении VCL у меня есть http-сервер. Я пытаюсь загрузить изображение из браузера. Вот код процедуры commandGet:

procedure TForm6.HTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  imageStream: TMemoryStream;
begin
  if Pos('command=addImage', ARequestInfo.UnparsedParams) > 0 then
  begin
    AResponseInfo.ContentText := UploadImageForm;
  end
  else if Pos('command=saveImage', ARequestInfo.UnparsedParams) > 0 then
  begin
    imageStream := TMemoryStream.Create;

    try
      ARequestInfo.PostStream.Seek(0, soFromBeginning);
      imageStream.LoadFromStream(ARequestInfo.PostStream);
      imageStream.SaveToFile('picture.jpeg');
    finally
      imageStream.Free;
    end;
  end;
end;

Вот код UploadImageForm:

 function UploadImageForm: string;
 var
   uploadImageHTMLForm: TStringBuilder;
 begin
   uploadImageHTMLForm := TStringBuilder.Create;

   try
     // by default enctype is application/x-www-form-urlencoded
     // uploadImageHTMLForm.AppendLine('<form action="/?command=saveImage" method="post">');
     // EDIT
     uploadImageHTMLForm.AppendLine('<form action="/?command=saveImage" method="post" enctype="multipart/form-data">');
     uploadImageHTMLForm.AppendLine('<input type="file" name="uploadField">');
     uploadImageHTMLForm.AppendLine('<input type="submit">');
     uploadImageHTMLForm.AppendLine('</form>');
     Result := uploadImageHTMLForm.ToString;
   finally
     uploadImageHTMLForm.Free;
   end;
 end;

Проблема в том, что когда я выбираю файл .jpeg и нажимаю «Отправить», ARequestInfo.PostStream пуст (я создаю его onCreatePostStream). Любая идея, как это решить.


person bob_saginowski    schedule 20.08.2014    source источник


Ответы (1)


Элементы HTML-формы <input> с type=file должны использовать enctype="multipart/form-data" (см. https://stackoverflow.com/a/2436725/80901).

Однако multipart/form-data не поддерживается TIdHTTPServer — см. загрузка файла TIdHTTPServer

Для извлечения содержимого файла из тела запроса требуется дополнительный код. (Раньше на форумах Embarcadero и Indy уже публиковались подобные примеры.)

person mjn    schedule 20.08.2014
comment
какое свойство aRequestInfo (RawHeaders, PostStream или другое) следует использовать. Можете ли вы опубликовать ссылку, потому что я еще не нашел ничего полезного - person bob_saginowski; 20.08.2014
comment
См. embarcadero.newsgroups.archived.at/ - person mjn; 20.08.2014
comment
спасибо за полезный источник. Вы снова помогли мне решить мою проблему :) - person bob_saginowski; 22.08.2014