Webブラウザからファイルを選択し、ファイルの中身をブラウザに表示するプログラムを書いています。環境は、OS:WindowsXP IIS:5.0 Delphi:5.0ent です。宜しくお願いします。
ブラウザから下記のような[multipart/form-data]形式でPOSTしたファイルのContent-Typeを取得しようとしています。
-----------------------------31363577721170
Content-Disposition: form-data; name="get_file"; filename="!HTM.TXT"
Content-Type: appication/octet-stream
ファイルの中身
-----------------------------31363577721170
今回の場合は、appication/octet-stream を取得したいのですが、
POS関数を使用すれば開始文字列は分かるのですが、終わりを判別することができません。あまりにレベルが低いのか、参考となるソースが見つけられませんでした。この問題を解決しないことには、ファイルの中身も取得できないと考えます。下記が現状のプログラムソースです。
このソースだとstrContentTypeには appication/octet-streamだけでなく、それ以降の文字列も入ってきてしまいます。なにか良い解決策はないでしょうか。それとも通常はこのような取得の仕方はしないのでしょうか。ご教授いただければと思います。宜しくお願いします。
var
buf , strContentType : string ;
intTypeStart , intContentStart , intContentEnd : integer ;
i : integer ;
begin
// multipart/form-data形式データをbufに格納
buf := Request.Content ;
intContentEnd := Length(buf) ;
if Pos( 'Content-Type:' , buf ) > 0 then
begin
// Content-Typeの開始文字数を取得
intTypeStart := Pos( 'Content-Type:' , buf ) + 14 ;
for i := intTypeStart to intContentEnd do
begin
strContentType := strContentType + buf[i] ;
if buf[ i ] = ' ' then // ← ここの記述が問題
break ;
end ;
end ;
end ;
......
intContentEnd := Length(buf);
intContentStart := Pos('Content-Type:', buf);
if intContentStart > 0 then begin
intTypeStart := intContentStart + Length('Content-Type:') + 1;
i := intTypeStart;
while not(buf[i] in [#13, #10]) do begin
if i >= intContentEnd then begin
ShowMessage('Content-Type 取得失敗');
exit;
end;
inc(i);
end;
strContentType := Copy(buf, intTypeStart, i - intTypeStart);
end;
CRLF探しさん、ありがとうございます。お名前の通り「改行コード探し」ですね。<CR><LF>(+#13#10)をこのように見つけられるとは、ホント勉強不足まる出しで申し訳なかったです。自身あまり知識が豊富でないので、この辺りも勉強していこうと思います。
あと実は、今もう一つ悩んでいるでいることがあります。それはデータの中身の取り出しについてです。Webブラウザから選択して表示したいデータはEXCELなのですが、現状文字化けしてます。まだちゃんと調べられてないので、もう少し四苦八苦してみます。それでも解決しないようであればまた質問されていただきます。
本当にありがとうございました。
ツイート | ![]() |