こんにちは。
VC 2005+WinXP SP3で開発しています。
htmlで
<form action=upload.cgi method=post enctype=multipart/form-data>
<p><input type=file name=filename /></p>
<p>
<input type=submit value=送信 />
<input type=reset value=リセット />
</p>
</form>
としてファイルを送信している部分をプログラムで実現したいです。
当初は、
char *szText = filename=c:/txt/a.txt;
const TCHAR *szContentType = _T(Content-Type: application/x-www-form-
urlencoded);
blRet = ::HttpSendRequest( hRequest, szContentType, _tcslen(szContentType),
(LPVOID)szText, lstrlenA(szText) );
とすれば、よいのかと思ったのですが、うまくいきませんでした。
次に実ファイルの中身を全部読み込んで、
sprintf(senddata, filename=%s, nakami);
szText = senddata;
const TCHAR *szContentType = _T(Content-Type: application/x-www-form-
urlencoded);
blRet = ::HttpSendRequest( hRequest, szContentType, _tcslen(szContentType),
(LPVOID)szText, lstrlenA(szText) );
としたのですが、こちらもうまくいきません。
ただ、送信自体はできているようです。
なので、filenameパラメータの与え方が間違っているのだと思うのですが、
どのようにすればよいのでしょうか?
なにかわかる方いましたらご教授ください。
よろしくお願いいたします。
追記です。
htmlではうまくいくのですが、
VCプログラム経由ですとPerlのオブジェクト作成自体ができないようです。
VCからCGIへのPOSTはだめなのでしょうか?
-----upload.cgi-------------------------------------------------
#!C:/Perl/bin/perl
# モジュール読み込み
use strict;
use CGI;
my ($buffer);
open (OUT, > Start.txt) || die Can't open Savefile!;
print OUT Start;
close (OUT);
////////////////////////////Start.txtは作成される
# オブジェクト作成
my $query = new CGI;
open (OUT, > new.txt) || die Can't open Savefile!;
print OUT new;
close (OUT);
////////////////////////////new.txtは作成されない
------------------------------------------------------
HTTP通信しているだけで相手がVCで作ったプログラムとか判らんよ。
だから相手がVCだとPerlが動作しないとかいうことは無い。
ブラウザで通信した時と同じものを送信してやれば理論的にはできるはず。
パケットキャプチャーして比べてみるとか。
boundaryは?
\r\nは?
> filename=c:/txt/a.txt
HTTPで渡すファイル名にディレクトリとか無いよ。
> sprintf(senddata, filename=%s, nakami);
# nakamiってファイルの中身っていう意味と解釈する。
filename=ファイルの中身ってならないよ。
HTTPは基本的に以下の形式になる。
ヘッダー\r\n
ヘッダー\r\n
ヘッダー\r\n
空行\r\n
中身中身中身中身中身中身中身中身中身中身
中身中身中身中身中身中身中身中身中身中身
中身中身中身中身中身中身中身中身中身中身
wclrp ( 'o') さん
ありがとうございます。
まずはキャプチャして追ってみます。
httpの形式についてもありがとうございます。
参考にさせていただきます。
multipart/form-dataで
boundaryなどをきちんとセットして送ったところ、
無事Perl側の動作もうまくいきました。
おそらく、送る形式が間違っていたので、
Perl側でnew CGIをするための情報がうまく取得できずに失敗していたのだと思います。
httpの形式とboundaryというキーワードのおかげで、
無事解決することができました。
ありがとうございました。