2013-06-26 3 views
1

DataSnap/WebBroker, HTML 사용먼저 파일을 서버에 저장하지 않고 다운로드하여 출력 할 수 있습니까?

나는 TStringList을 만들고로드 한 다음 파일에 저장합니다. 파일 위치를 내 HTML 양식의 동작에 넣어 강제로 다운로드합니다. 파일을 저장하지 않고이 작업을 수행하려면 어떻게해야합니까?

MyList := TStringList.Create; (leaving out try/finally, etc.) 
MyList.Add() .... 
MyList.SaveToFile(MyFullFileName); 
MyList.Free; 

WebModuleDefaultHandler이 HTML을 반환 :

<html><head /> 
    <body onload="document.FormOne.submit()"> 
    <form id="FormOne" name="FormOne" method="get" 
      action="MyFullFileName"> 
     <input type="submit" id="btSubmit1" name="btSubmit1" /> 
    </form> 
    </body> 
</html> 

내가 먼저 저장하지 않고 MyList을 보낼 수있는 방법이 있습니까?

MyStream:= TMemoryStream.Create; 
try 
    MyList:= TStringList.Create; 
    try 
    MyList.Add() ... 
    MyList.SaveToStream(MyStream); 
    finally 
    MyList.Free; 
    end; 
    MyStream.Position:= 0; 
    Response.ContentType:= 'text/html'; 
    Response.ContentStream:= MyStream; 
finally 
    MyStream.Free; 
end; 

요청이 클라이언트에서 서버에 제공

, 당신은 통과해야 ...

+0

당신은 HTML 코드가 어떻게 보이는지 보여줄 수 있습니까? 또는 TStringList의 문자열 만 포함 된 일반 텍스트 파일로 HTTP 응답에 응답하는 방법을 찾고 있습니까? – mjn

+0

후자입니다. 위의 코드는 다운로드 대화 상자의 결과로, 파일 저장 위치 (브라우저에 따라 다름)를 묻습니다. 사용자가 파일에 저장하고 화면에 표시 할 수 없도록 문자열을 보내려고합니다. – Debby

답변

2

는 메모리 스트림으로 수행 (수신자는 표준 브라우저가 아닌 델파이 클라이언트를 사용하는) 응답 ContentStream 필드로 다시 MyStream 스트림. 무엇인가를하기 전에 항상 스트림을 다시 0으로 설정하는 것을 잊지 마십시오!

또는 String List의 Text 속성을 사용하여이를 수행 할 수도 있습니다. 그렇게 ...

일반적으로 스트림은 이미지와 같은 원시 파일을로드/저장/호스팅해야 할 때 가장 적합합니다. 캔버스에 그려서 캔버스를 JPG 이미지로 변환하고 파일 대신 스트림으로 저장하는 것이 매우 편리 할 수 ​​있습니다. 그런 다음 Response.ContentStream으로 전달하십시오. 따라서 스트림을 사용하는 데 더 익숙해졌습니다. 스트림을 사용하는 것이 콘텐츠를 반환하는 표준 방법이기 때문입니다.

PS - 당신은 당신이 사용할 수있는 text/plainContentType를 사용하거나, 모든 종류의 파일을 원하는 경우 test.txt 같은 파일로 다운로드 할 다음, 일반 텍스트로 표시 할 수 있도록이 파일을 원하는 경우 ContentType에 대해서는 application/octet-stream입니다.

+0

데비 (Debby) : MyStream 예제가 대상이지만 나에게있어 중요한 부분은 내가 남긴 부분입니다. // Send MyStream 어떻게 보내나요? 내 HTML은 현재 사용 중입니다.

"MyFullFileName"대신 "MyStream"을 사용할 수 있습니까? – Debby

+0

"보내는 방법"을 질문으로 이해하지 못했지만, "파일로 저장하지 않고 보내십시오"라는 질문을 질문으로, 이해하는 방법을 알고 있다고 생각했습니다. 보내는 방법을 모르는 경우 HTTP 서버가 클라이언트에 아무 것도 보낼 수 없으며 클라이언트 만 서버에 데이터를 요청할 수 있습니다. 단방향 연결. –

+0

.txt 파일을 만들고 브라우저로 보내거나 강제로 다운로드하는 방법을 알고 있습니다. 더 나은 질문 : 파일을 하드 드라이브에 남기지 않고 어떻게 동일한 결과를 얻을 수 있습니까? 답변 : 스트림을 사용하는 것이 좋습니다. 그러나 중요한 점은 데이터를 사용자의 하드 드라이브에 저장하는 것입니다. 이미 TStringStream을 시도했지만 그것을 보내는 방법을 알지 못했습니다.따라서 필자는 Delphi/WebBroker가 파일처럼 보이는 스트림을 반환하는 방법을 배워야하거나, 다른 구조와 구조를 전송하는 방법이 필요합니다. 브라우저에는 HTML이 필요하므로 예, HTML이 대답의 일부입니다. – Debby

관련 문제