wininet.dllでtype=fileの時のパラメータの与え方 – プログラミング – Home

通知
すべてクリア

[解決済] wininet.dllでtype=fileの時のパラメータの与え方


アレン
 アレン
(@アレン)
ゲスト
結合: 17年前
投稿: 18
Topic starter  

こんにちは。
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パラメータの与え方が間違っているのだと思うのですが、
どのようにすればよいのでしょうか?

なにかわかる方いましたらご教授ください。
よろしくお願いいたします。


引用未解決
トピックタグ
アレン
 アレン
(@アレン)
ゲスト
結合: 17年前
投稿: 18
Topic starter  

追記です。

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は作成されない

------------------------------------------------------


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

HTTP通信しているだけで相手がVCで作ったプログラムとか判らんよ。
だから相手がVCだとPerlが動作しないとかいうことは無い。

ブラウザで通信した時と同じものを送信してやれば理論的にはできるはず。
パケットキャプチャーして比べてみるとか。

boundaryは?
\r\nは?


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

> filename=c:/txt/a.txt
HTTPで渡すファイル名にディレクトリとか無いよ。

> sprintf(senddata, filename=%s, nakami);
# nakamiってファイルの中身っていう意味と解釈する。
filename=ファイルの中身ってならないよ。

HTTPは基本的に以下の形式になる。

ヘッダー\r\n
ヘッダー\r\n
ヘッダー\r\n
空行\r\n
中身中身中身中身中身中身中身中身中身中身
中身中身中身中身中身中身中身中身中身中身
中身中身中身中身中身中身中身中身中身中身


返信引用
アレン
 アレン
(@アレン)
ゲスト
結合: 17年前
投稿: 18
Topic starter  

wclrp ( 'o') さん

ありがとうございます。
まずはキャプチャして追ってみます。

httpの形式についてもありがとうございます。
参考にさせていただきます。


返信引用
アレン
 アレン
(@アレン)
ゲスト
結合: 17年前
投稿: 18
Topic starter  

multipart/form-dataで
boundaryなどをきちんとセットして送ったところ、
無事Perl側の動作もうまくいきました。

おそらく、送る形式が間違っていたので、
Perl側でnew CGIをするための情報がうまく取得できずに失敗していたのだと思います。

httpの形式とboundaryというキーワードのおかげで、
無事解決することができました。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました