자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)


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 소스가 변경이 되면서 오류가 발생한 것일까요?

아니면 제가 파라미터 세팅을 잘못한 것일까요?

이틀을 헤매고 있습니다.

해법을 알려 주십시오.

감사합니다.

onehana@yahoo.com

번호 제목 글쓴이 날짜 조회 수
공지 [프로그래밍 강의] 2021.6~2021.12 관리자 2015.01.22 15759
공지 유용한 관련 사이트 관리자2 2014.03.20 54576
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 97971
659 Open ssl 과 indy 관련 질문입니다. [8] 현수막 2019.01.23 1436
658 App Tethering 문의 [1] 홍루 2014.05.26 1436
657 Exception in safecall method 발생 superman 2014.10.29 1439
656 [DelphiXE7] 컨트롤을 동적생성하여 해제하면 Form을 닫을 수 없게 됩니다. [3] file 사조성 2014.12.21 1441
655 Delphi XE6 에서 IdFTP 문의 합니다. [1] 파빌신 2014.07.30 1442
654 Camera Component예제 응용에 관한 질문 [2] 아크나톤 2017.11.25 1446
653 델파이 이벤트 처리시 에러입니다. [1] file 시크원 2014.07.19 1452
652 바코드 프린터 제어 관련 [3] JJ 2015.02.06 1457
651 delete 문을 TServerMethods1 을 통해서 하려니까 Error가 나네요? [1] 어려워 2014.07.23 1460
650 비콘을 이용한 푸시메시지 앱을 개발하기 위해 안드로이드 서비스개발은 어떻게 하나요? [1] Humphery 2015.08.25 1461
649 퀵리포트를 PDF로 변환하고자 합니다. [2] 손승규 2016.03.10 1461
648 Visual Studio C++ DLL 사용 시 CString 처리는... [1] 신지 2015.04.20 1464
647 델파이 XE7에서 ClientDataSet1 에 환경설정 하고 ACTIVE 을 True 하면 Access violation at address 50BDDD17 in module 'dsnap210.bpl'. Read of address 00000000. 라는 오류메세지가 나옵니다 [3] delphi 2015.07.13 1465
646 겔럭시S6 앱 실행시 하얀 화면만 나옵니다. [1] 사랑남 2015.08.20 1465
645 REST Debugger Json파싱 문의 [3] file 김태윤 2016.03.31 1467
644 앱 광고 적용하는 방법.. [1] file 김하나 2014.04.26 1469
643 사용자 지정 텍스트 크기(DPI) 설정. [1] file 김재욱 2016.01.22 1475
642 file->new->other->datasnap server탭-> datasnap server 아이콘이 갑자기 안나타납니다. [1] 어려워 2014.07.07 1481
641 [세미나] 6월 10일 웹세미나의 질문답변 Humphery 2014.06.12 1486
640 [XE6] 잘 되던 놈이 갑자기 이런메세지가 나네요.... 어려워 2014.11.22 1486