Q&A

  • 급함! Upload Component 개발중 에러발생...
안녕하세요.. 부산의 화랑입니다..



이번에 Active Server Component로 upload를 할려고 하는데..



문자열에 관해서 에러가 납니다.. 여러 고수님의 지도 부탁드립니다.



어려운 것은 아니라고 생각이 드는데.. 전 델파이 기초가 부족해서...



소스를 보시고 ..... 꼭 해답을 주세요.. 2주간 잠도 제대로 못 잠...



부탁드립니다



/////////////////////////////////////////////////////

(소스1)



Function XXXX

Var

UploadFile :WideString;

TotalByte : Olevariant;

Data : String;

fsFile : TFileStream

Begin

TotalByte : Request.TotalByte;

UploadFile : Request.BinaryRead(TotalByte);

// 위는 화일을 전송하는 것을 Uploadfile에 저자



**질문1: //아래와 같이 그대로 저장을 하면 절반밖에 들어가지 않아요



fsFile := TFileStream.Create(XXX)

try

tsFile.Write(PChar(UploadFile)^,Length(UploadFile));

finally

tsFile.free;

End;



Response.Write(UploadFile);

Response.BinaryWrite(UploadFile);



End





소스2)



Function XXXX

Var

UploadFile :WideString;

TotalByte : Olevariant;

Data : String;

fsFile : TFileStream

Begin

TotalByte : Request.TotalByte;

UploadFile : Request.BinaryRead(TotalByte);

// 위는 화일을 전송하는 것을 Uploadfile에 저자



Data := UploadFile+AnsiLowCase(UploadFile)

// 이런식으로하면.. 아래에서 화일에 전부저장이 됩니다..



*질문2 여기서 AnsiLowCase는 소문자로 바꾸어지는 것이 아닌가요?

그런데.... 왜 Upload 된 데이터가 다 만들어지죠?



fsFile := TFileStream.Create(XXX)

try

tsFile.Write(PChar(Data)^,Length(Data));

finally

tsFile.free;

End;



질문3 // 여기서 Response에서 Write를 하면 깨져나옵니다.(화일은 정상으로 저장)



Response.Write(UploadFile);



질문4 // 여기서 Response에서 BinaryWrite를 하면 아주 정상적으로 나옵니다.



Response.BinaryWrite(UploadFile);



End



마지막으로 정리하면

1. WideString으로 받으면 왜 반밖에 저장이 안되나요?(2Byte때문?)



2. String으로 받으면 저장할때 완전히 깨어짐(WideString->String 으로 변환필요)

그런데 UniCode <-> AnsiCode 바꾸어 주어야 함



3. AnsiLowCase를 하면 왜 다 만들어 지죠?



4. 파일은 바로 저장이 되는데 브라우저에서 보여질때는 깨져나오나요?



5. 그리고 Pos라는 함수를 쓰면 문자열이 반드시 있는데. 찾지 못하죠?



6. 마지막에 binarywrite를 쓰면 바로 화면에 출력이되는데. 이 binary를



어떻게 String으로 변환을 하죠



넘 길었죠??? 한 2주간 이문제로 잠을 못 자고 있어요... 부탁드립니다

1  COMMENTS
  • Profile
    디밥 1999.11.02 20:12
    화랑 wrote:

    > 안녕하세요.. 부산의 화랑입니다..

    >

    > 이번에 Active Server Component로 upload를 할려고 하는데..

    >

    > 문자열에 관해서 에러가 납니다.. 여러 고수님의 지도 부탁드립니다.

    >

    > 어려운 것은 아니라고 생각이 드는데.. 전 델파이 기초가 부족해서...

    >

    > 소스를 보시고 ..... 꼭 해답을 주세요.. 2주간 잠도 제대로 못 잠...

    >

    > 부탁드립니다

    >

    > /////////////////////////////////////////////////////

    > (소스1)

    >

    > Function XXXX

    > Var

    > UploadFile :WideString;

    > TotalByte : Olevariant;

    > Data : String;

    > fsFile : TFileStream

    > Begin

    > TotalByte : Request.TotalByte;

    > UploadFile : Request.BinaryRead(TotalByte);

    > // 위는 화일을 전송하는 것을 Uploadfile에 저자

    >

    > **질문1: //아래와 같이 그대로 저장을 하면 절반밖에 들어가지 않아요

    >

    > fsFile := TFileStream.Create(XXX)

    > try

    > tsFile.Write(PChar(UploadFile)^,Length(UploadFile));

    > finally

    > tsFile.free;

    > End;

    >

    > Response.Write(UploadFile);

    > Response.BinaryWrite(UploadFile);

    >

    > End

    >

    >

    > 소스2)

    >

    > Function XXXX

    > Var

    > UploadFile :WideString;

    > TotalByte : Olevariant;

    > Data : String;

    > fsFile : TFileStream

    > Begin

    > TotalByte : Request.TotalByte;

    > UploadFile : Request.BinaryRead(TotalByte);

    > // 위는 화일을 전송하는 것을 Uploadfile에 저자

    >

    > Data := UploadFile+AnsiLowCase(UploadFile)

    > // 이런식으로하면.. 아래에서 화일에 전부저장이 됩니다..

    >

    > *질문2 여기서 AnsiLowCase는 소문자로 바꾸어지는 것이 아닌가요?

    > 그런데.... 왜 Upload 된 데이터가 다 만들어지죠?

    >

    > fsFile := TFileStream.Create(XXX)

    > try

    > tsFile.Write(PChar(Data)^,Length(Data));

    > finally

    > tsFile.free;

    > End;

    >

    > 질문3 // 여기서 Response에서 Write를 하면 깨져나옵니다.(화일은 정상으로 저장)

    >

    > Response.Write(UploadFile);

    >

    > 질문4 // 여기서 Response에서 BinaryWrite를 하면 아주 정상적으로 나옵니다.

    >

    > Response.BinaryWrite(UploadFile);

    >

    > End

    >

    > 마지막으로 정리하면

    > 1. WideString으로 받으면 왜 반밖에 저장이 안되나요?(2Byte때문?)

    >

    > 2. String으로 받으면 저장할때 완전히 깨어짐(WideString->String 으로 변환필요)

    > 그런데 UniCode <-> AnsiCode 바꾸어 주어야 함

    >

    > 3. AnsiLowCase를 하면 왜 다 만들어 지죠?

    >

    > 4. 파일은 바로 저장이 되는데 브라우저에서 보여질때는 깨져나오나요?

    >

    > 5. 그리고 Pos라는 함수를 쓰면 문자열이 반드시 있는데. 찾지 못하죠?

    >

    > 6. 마지막에 binarywrite를 쓰면 바로 화면에 출력이되는데. 이 binary를

    >

    > 어떻게 String으로 변환을 하죠

    >

    > 넘 길었죠??? 한 2주간 이문제로 잠을 못 자고 있어요... 부탁드립니다



    역쉬.... Pos등 String 때문에 고생하고 계실 줄 알았습니다....

    BinaryRead로 읽어온것을 String으로 변환하면 무조건 안됩니다.

    모든것은 PByteArray 형태로 만든후에 Pos를 쓰지마시고 CompareMem를 사용하여 메모리 상에서 BYTE값을 가지고 비교해야 합니다. (File 부분 만이라도)...



    참고로 Delphi의 TFileStream은 느리기 때문에 Win32API의 WriteFile을 사용하시길 바랍니다.