자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi XE3에서 INDY를 이용한 http 파일 전송 오류
2012.10.12 04:28
indy를 이용한 파일 업로드가 낮은 버전(2010)에서 잘 됐었는데 XE3에서는 오류가 발생합니다.
낮은 버전에서 소스는 다음과 같습니다.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, IdMultipartFormData,
IdHTTP;
type
TForm3 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
function UploadInsImages: boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
UploadInsImages;
end;
function TForm3.UploadInsImages: boolean;
var
PostData: TIdMultiPartFormDataStream;
sReceive : TStringList;
IdHTTP2: TIdHTTP;
begin
sReceive := TStringList.Create;
IdHTTP2 := TIdHTTP.Create;
Result := True;
PostData := TIdMultiPartFormDataStream.Create;
try
PostData.AddFormField('pID', '277' );
PostData.AddFormField('imageFolder', 'img' );
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream');
PostData.Position := 0;
idHttp2.Request.ContentType := postData.RequestContentType;
sReceive.text := idHttp2.Post('http://mydomain/up.asp', PostData);
showmessage(sReceive.Text);
if trim(sReceive.text) <> 'OK' then Result := False;
finally
FreeAndNil(PostData);
end;
end;
end.
이 소스는 아주 잘 됩니다. 파일이 잘 올라 갑니다.
아쉽게도 이 소스가 XE3로 가면 그냥 업로드하면 오류가 생겨 약간 변경을 합니다.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, IdMultipartFormData,
IdHTTP;
type
TForm3 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
function UploadInsImages: boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
UploadInsImages;
end;
function TForm3.UploadInsImages: boolean;
var
PostData: TIdMultiPartFormDataStream;
sReceive : TStringList;
IdHTTP2: TIdHTTP;
begin
sReceive := TStringList.Create;
IdHTTP2 := TIdHTTP.Create;
Result := True;
PostData := TIdMultiPartFormDataStream.Create;
try
PostData.AddFormField('pID', '277', 'utf-8', 'text/plain', '277');
PostData.AddFormField('imageFolder', 'img', 'utf-8', 'text/plain', 'img');
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream');
PostData.Position := 0;
idHttp2.Request.ContentType := postData.RequestContentType;
sReceive.text := idHttp2.Post('http://mydomain/up.asp', PostData);
showmessage(sReceive.Text);
if trim(sReceive.text) <> 'OK' then Result := False;
finally
FreeAndNil(PostData);
end;
end;
end.
위 빨간 색 부분은 제가 엄청 많은 시간 고생한 끝에 찾아 낸 해법으로, 저렇게 해야 변수 값이 제대로 올라갑니다.
처음에는 변수 값이 제대로 안 오길래 무지무지 고생하다가 찾아내서 다 해결된 줄 알았습니다.
그런데, 업로드된 파일의 맨 첫 부분에 0D 0A 두 바이트가 삽입이 되는 심각한 문제가 발생했습니다.
Edit1 에는 업로드할 파일 이름이 들어 있습니다.
jpg 이미지를 업로드 하던, zip 파일을 업로드 하던 마찬가지입니다.
업로드된 파일의 첫번째 두 바이트가 0D 0A 입니다.
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream'); 여기서 MIME 타입을 여러 가지로 바꿔 봤는데 결과는 같습니다.
XE3로 되면서 INDY 소스가 변경이 되면서 오류가 발생한 것일까요?
아니면 제가 파라미터 세팅을 잘못한 것일까요?
이틀을 헤매고 있습니다.
해법을 알려 주십시오.
감사합니다.
댓글 2
Delphi XE3에서 INDY를 이용한 http 파일 전송 오류
2012.10.12 04:28
indy를 이용한 파일 업로드가 낮은 버전(2010)에서 잘 됐었는데 XE3에서는 오류가 발생합니다.
낮은 버전에서 소스는 다음과 같습니다.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, IdMultipartFormData,
IdHTTP;type
TForm3 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
function UploadInsImages: boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form3: TForm3;implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
UploadInsImages;
end;function TForm3.UploadInsImages: boolean;
var
PostData: TIdMultiPartFormDataStream;
sReceive : TStringList;
IdHTTP2: TIdHTTP;
begin
sReceive := TStringList.Create;
IdHTTP2 := TIdHTTP.Create;
Result := True;
PostData := TIdMultiPartFormDataStream.Create;
try
PostData.AddFormField('pID', '277' );
PostData.AddFormField('imageFolder', 'img' );
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream');
PostData.Position := 0;
idHttp2.Request.ContentType := postData.RequestContentType;
sReceive.text := idHttp2.Post('http://mydomain/up.asp', PostData);
showmessage(sReceive.Text);
if trim(sReceive.text) <> 'OK' then Result := False;
finally
FreeAndNil(PostData);
end;
end;
end.
이 소스는 아주 잘 됩니다. 파일이 잘 올라 갑니다.
아쉽게도 이 소스가 XE3로 가면 그냥 업로드하면 오류가 생겨 약간 변경을 합니다.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, IdMultipartFormData,
IdHTTP;type
TForm3 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
function UploadInsImages: boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form3: TForm3;implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
UploadInsImages;
end;function TForm3.UploadInsImages: boolean;
var
PostData: TIdMultiPartFormDataStream;
sReceive : TStringList;
IdHTTP2: TIdHTTP;
begin
sReceive := TStringList.Create;
IdHTTP2 := TIdHTTP.Create;
Result := True;
PostData := TIdMultiPartFormDataStream.Create;try
PostData.AddFormField('pID', '277', 'utf-8', 'text/plain', '277');
PostData.AddFormField('imageFolder', 'img', 'utf-8', 'text/plain', 'img');
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream');
PostData.Position := 0;
idHttp2.Request.ContentType := postData.RequestContentType;
sReceive.text := idHttp2.Post('http://mydomain/up.asp', PostData);
showmessage(sReceive.Text);
if trim(sReceive.text) <> 'OK' then Result := False;finally
FreeAndNil(PostData);
end;
end;
end.
위 빨간 색 부분은 제가 엄청 많은 시간 고생한 끝에 찾아 낸 해법으로, 저렇게 해야 변수 값이 제대로 올라갑니다.
처음에는 변수 값이 제대로 안 오길래 무지무지 고생하다가 찾아내서 다 해결된 줄 알았습니다.
그런데, 업로드된 파일의 맨 첫 부분에 0D 0A 두 바이트가 삽입이 되는 심각한 문제가 발생했습니다.
Edit1 에는 업로드할 파일 이름이 들어 있습니다.
jpg 이미지를 업로드 하던, zip 파일을 업로드 하던 마찬가지입니다.
업로드된 파일의 첫번째 두 바이트가 0D 0A 입니다.
PostData.AddFile('file', Edit1.Text, 'Application/octet-stream'); 여기서 MIME 타입을 여러 가지로 바꿔 봤는데 결과는 같습니다.
XE3로 되면서 INDY 소스가 변경이 되면서 오류가 발생한 것일까요?
아니면 제가 파라미터 세팅을 잘못한 것일까요?
이틀을 헤매고 있습니다.
해법을 알려 주십시오.
감사합니다.
인디 컴포넌트는 델파이 버전이 바뀌며 보통 코드가 변경됩니다. 제가 http 소스가 있는데 일단 보냅니다. 인디는 원래 free 컴포넌트로 저희가 다 지원해 드릴수는 없습니다. 제가 한번 xe3에서 테스트는 한반 해 보겠습니다.