multipart/form-data形式の取得について

解決


フォレ  2005-06-12 07:10:11  No: 15567

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 ;


CRLF探し  2005-06-12 08:20:52  No: 15568

......
  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;


フォレ  2005-06-12 09:37:14  No: 15569

CRLF探しさん、ありがとうございます。お名前の通り「改行コード探し」ですね。<CR><LF>(+#13#10)をこのように見つけられるとは、ホント勉強不足まる出しで申し訳なかったです。自身あまり知識が豊富でないので、この辺りも勉強していこうと思います。
あと実は、今もう一つ悩んでいるでいることがあります。それはデータの中身の取り出しについてです。Webブラウザから選択して表示したいデータはEXCELなのですが、現状文字化けしてます。まだちゃんと調べられてないので、もう少し四苦八苦してみます。それでも解決しないようであればまた質問されていただきます。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加