[リストへもどる]
一括表示
タイトルファイルのアップロード
記事No170
投稿日: 2007/03/27(Tue) 18:46
投稿者YOS
投稿時にはじかれてしまうので、泣く泣く、該当部分を削除します。

Q.複数ファイルのアップロードは出来ますか?

1.まず、フォームエディタ用に定義して、発言作成。
<input type="file" name="file" ...>
<input type="file" name="x-file2" ...>
<input type="file" name="x-file3" ...>

2.CPX内で、それを指定します。
>...&image_filename1=$F&image_filename2=$X(x-file2)&image_filename3=$X(x-file3)';

3.マルチパートで、投稿
・MakePostParam.bMultiPart := True;
とやってから投稿する。

やりとりをフックして覗くと、
$Fを指定している画像1は、「Content-Type:application/octet-stream」が付きますが、画像2と3は、付きません。

CPXの仕様として、「アップロードできるファイルは一個だけ」は、OKなんですが、「Content-Type:application/octet-stream」が無いと、サーバーにはじかれます。

どうでしょうか。


これで、投稿できるかな?
----
YOS

タイトルRe: ファイルのアップロード
記事No171
投稿日: 2007/03/27(Tue) 19:10
投稿者DECO
YOSさん、こんにちは。

>Q.複数ファイルのアップロードは出来ますか?

残念ながらできません・・・。

DECO

タイトルRe2: ファイルのアップロード
記事No172
投稿日: 2007/03/27(Tue) 19:18
投稿者DECO
YOSさん、こんにちは。

CMNの基本機能としてはできませんが、MakePostDataを自前で実装すれば可能です・・・。

DECO

タイトルRe3: ファイルのアップロード
記事No173
投稿日: 2007/03/27(Tue) 20:01
投稿者YOS
#172 DECOさん、こんにちは。

>CMNの基本機能としてはできませんが、MakePostDataを自前で実装すれば可能です・・・。

よく見たら、CMN本体が提供している方ではないですか。
はっきり言って、無理です。(^_^;

かくなる上は、サーバーに、見逃してくれるように頼むしかないですね。
folomyだし。


無理ですね、さすがに。
うーむ、こまった。
----
YOS

タイトルRe4: ファイルのアップロード
記事No174
投稿日: 2007/03/27(Tue) 20:14
投稿者うぇいく
>無理ですね、さすがに。
だいじょぶです。慣れれば簡単です(笑)
# httpの直接実装。

# airWebのときに、Multipart対応のために自分で実装しました・・・
# 今回のは、Mutipartは考慮してないけど、自分で実装・・・
-- CMN v0.50dβ --

タイトルRe5: ファイルのアップロード
記事No175
投稿日: 2007/03/28(Wed) 09:30
投稿者うぇいく
ふと思ったのですが・・・・直接通信にかかわらないけども、おそらくはほぼ全てのExtensionで使用する機能については、CMN本体に基本的な機能(cpsでも共通で使えるぐらいの分?)に入れたうえで、より、高機能なものを、*.pasや*.cppや*.libや*.dllで(オフィシャルに、もしくは、第3者が)作成して提供する というのも、よいかもしれない・・・(第3社ライブラリの場合は、ソースの公開と、改変利用(改変したソースの再配布は別)を許可しないと、怖くて使えない・・・)
# 通信機能も、Indyとかつかって、全部cpx側で実装したりして(笑)

# Delphiから利用するライブラリもどきを、cppで作成するには、どうするのだろう・・・?DLLにするしかない?
-- CMN v0.50dβ --

タイトルRe6: ファイルのアップロード
記事No176
投稿日: 2007/03/28(Wed) 11:09
投稿者DECO
うぇいくさん、こんにちは。

> より、高機能なものを、*.pasや*.cppや*.libや*.dllで(オフィシャルに、もしくは、第3者が)作成して提供する というのも、よいかもしれない・・・

それもいいと思います。
多くのエクステンションが使用する機能ならcpx用のインターフェースに追加したいと思いますが。
ただCOMインターフェースなのである程度まとまってからインターフェースをバージョンアップするということになります。

># Delphiから利用するライブラリもどきを、cppで作成するには、どうするのだろう・・・?DLLにするしかない?

DLLにするのがいいのではないでしょうか。

DECO

タイトルRe6: ファイルのアップロード
記事No180
投稿日: 2007/03/28(Wed) 19:17
投稿者YOS
#175 うぇいくさん、こんにちは。

>通信機能も、Indyとかつかって、全部cpx側で実装したりして(笑)

Indyに、確かありましたよね?HTTP。
メール送受信ユニット作ったことがあるので、ある程度は想像が付きます。

本当は、MakePstDataだけ自前で作って、後は、デバッグ済みのAPI使いたいところですが、合わせる仕様が分からないので、全部作るしかないですね。
まあ、返ってきたHtmlソースのキーコードなどを取り出すだけのことなので、なんとかなる.............かな?

>Delphiから利用するライブラリもどきを、cppで作成するには、どうするのだろう・・・?DLLにするしかない?

開発元が同じなので、何とかなりそうなものですが、無理かも知れませんね。

DLLだと、ついでに、あれもこれもと、入れ込みたくなりませんか?(^_^;

----
YOS

タイトルRe7: ファイルのアップロード
記事No181
投稿日: 2007/03/29(Thu) 00:36
投稿者うぇいく   <weyk@nifty.com>
>本当は、MakePstDataだけ自前で作って、後は、デバッグ済みのAPI使いたいところですが、合わせる仕様が分からないので、全部作るしかないですね。
 WebRequestになげるときのパラメータで、lpPostに中身を入れて、cPostにサイズをいえて、中身にあわせて、headerのほうに、LengthとかContent-Typeとかを設定するだけです。なので、Postする内容さえできてしまえば、あとは簡単です。
# ここでのContentTypeはPostされるデータ全体のContentTypeなので、multiparthogehogeというやつ。postデータの中のそれぞれにも(必要に応じて)contet-Typeを持っているはず。

おそらくは、
・Base64のEncode/Decodeを行う処理
・データ中に間違って出てきたりしない、Boundaryを決定する処理
あたりを作成した上で、ごりごりと作れば簡単・・・な気がします。
# airWebで1番悩んだのが、Boundaryの決定処理・・・こればかりはRFCに無い(笑)

>>Delphiから利用するライブラリもどきを、cppで作成するには、どうするのだろう・・・?DLLにするしかない?

>開発元が同じなので、何とかなりそうなものですが、無理かも知れませんね。
えー、Borland C++Builderは、昔から、*.pasのコンパイル機能を持っているんですが、Delphiは、*.cppのコンパイル機能を持ってないんですよねぃ=^^;=

なので、ソースであれば、恐ろしいまでに一方通行で利用可能です。
# Borlandにとじるなら、Componentにすれば、相互に利用できます。ただし、ご存知の通り、Turbo hoghogeの無償版では利用できません。
-- CMN v0.50dβ --

タイトルRe8: ファイルのアップロード
記事No182
投稿日: 2007/03/29(Thu) 01:36
投稿者DECO
うぇいくさん、こんにちは。

>・Base64のEncode/Decodeを行う処理
>・データ中に間違って出てきたりしない、Boundaryを決定する処理

ファイルアップロードではEncodeせずそのままバイナリで流します。
ので、結構簡単です。

Boundaryは「絶対」というものがないので難しいところですね。
CMNでは単純に「--------年月日時分秒(1/100単位)乱数」といった感じにしてます。

>>開発元が同じなので、何とかなりそうなものですが、無理かも知れませんね。
>えー、Borland C++Builderは、昔から、*.pasのコンパイル機能を持っているんですが、Delphiは、*.cppのコンパイル機能を持ってないんですよねぃ=^^;=

クラスにするとコンパイラによってメンバーの名前の付け方が違ってしまいますが、pascal 宣言した関数にしてdllにすればコンパイラ依存せず Delphi でも C でも C++ でもアクセスできますよ。

DECO

タイトルRe9: ファイルのアップロード
記事No183
投稿日: 2007/03/29(Thu) 02:07
投稿者うぇいく   <weyk@nifty.com>
>ファイルアップロードではEncodeせずそのままバイナリで流します。
>ので、結構簡単です。
・・・あれ?そうすると、szなString(Null-Terminate)と、ちゃんと意識して区別さえしていれば、あとは簡単ですね・・・
# Pascalはもともと、文字列はszではなく、Length管理ですよね?

>Boundaryは「絶対」というものがないので難しいところですね。
>CMNでは単純に「--------年月日時分秒(1/100単位)乱数」といった感じにしてます。
airWebのとき(WebForumの画像アップロード対応のときです(笑)は、各要素を生成後に、1度、生成したboundary候補で検索して、ほんとーに無いことをチェックしてました。


>>>開発元が同じなので、何とかなりそうなものですが、無理かも知れませんね。
>>えー、Borland C++Builderは、昔から、*.pasのコンパイル機能を持っているんですが、Delphiは、*.cppのコンパイル機能を持ってないんですよねぃ=^^;=

>クラスにするとコンパイラによってメンバーの名前の付け方が違ってしまいますが、pascal 宣言した関数にしてdllにすればコンパイラ依存せず Delphi でも C でも C++ でもアクセスできますよ。
 あ、DLLにする分には、extern Cで引数による関数名の変化を抑えたり、STDCALLやPASCALなどにより、引数の詰め方(?)をあわせられるのは知っていますが、共通機能をDLLの場合、「配布ファイルが2つになる」とか、「他のcpxで同じ(名前の)DLLを使っていたらどーしよー?」という問題も出て着てしまうため、静的リンクをする方法を考えていました(ふつうのcpxが、cpx+frm+txtで3ファイル というのはおいといて(笑))。
 その場合に、Borland C++Builderの場合は、*.cppも*.pasも1つのProjetにほおりこんだ上で、そのままBuildするだけでリンクできてしまいます。ただし、IDEのエディッタ自体は、PASCALに対応しているわけでもなく、HELPになにかのっているわけでもないため、本当に単にコンパイルできるだけ という感じでした。
# おそらくは、VCL自体がPascalなんで、サポートしないわけには行かなかったんでしょうね・・・
-- CMN v0.50dβ --

タイトルRe10: ファイルのアップロード
記事No187
投稿日: 2007/03/29(Thu) 12:18
投稿者YOS
#183 うぇいくさん、こんにちは。

>共通機能をDLLの場合、「配布ファイルが2つになる」とか、「他のcpxで同じ(名前の)DLLを使っていたらどーしよー?」という問題も出て着てしまう

考え方としては、新規参入を促す意味にでも、有用だと思いますので、前向きに検討する価値があると思います。

・そもそも何があると良いのか
・開発者名を入れるとか、重複しないDLL名の決定方法。

この辺を詰めれば、何とかいけるように思います。

----
YOS

タイトルRe10: ファイルのアップロード
記事No188
投稿日: 2007/03/29(Thu) 12:55
投稿者DECO
うぇいくさん、こんにちは。

>・・・あれ?そうすると、szなString(Null-Terminate)と、ちゃんと意識して区別さえしていれば、あとは簡単ですね・・・

です。
生成されるpostデータはzstringではないです。(nullを含む可能性があります。)

># Pascalはもともと、文字列はszではなく、Length管理ですよね?

そのへんはYOSさんでないとわかりません。(笑)

>airWebのとき(WebForumの画像アップロード対応のときです(笑)は、各要素を生成後に、1度、生成したboundary候補で検索して、ほんとーに無いことをチェックしてました。

おぉ、それなら確実に重複しないですね。

> 「配布ファイルが2つになる」とか、

cpxに同梱せずにdll単品でCMNのサイトにエクステンション登録できるようにするという手もありますね。

> 「他のcpxで同じ(名前の)DLLを使っていたらどーしよー?」

CMNのサイト上に登録するという形にすれば重複は防げますね。
まぁ、そうそう重複するものでもないとは思いますけど。

DECO

タイトルRe8: ファイルのアップロード
記事No186
投稿日: 2007/03/29(Thu) 12:18
投稿者YOS
#181 うぇいくさん、こんにちは。

>なので、Postする内容さえできてしまえば、あとは簡単です。

Indyに投げるにしても、似たようなデータを格納する必要があるので、cmnWebRequest(WebParam)だけ自前で作るのが良さそうですね。

># airWebで1番悩んだのが、Boundaryの決定処理・・・こればかりはRFCに無い(笑)

何も考えず、cmnMakePostDataした後に、boundary='+MakePostParam.szBoundaryとやってます。
おんぶにだっこです。(^^)

># Borlandにとじるなら、Componentにすれば、相互に利用できます。ただし、ご存知の通り、Turbo hoghogeの無償版では利用できません。

cppって、C++ですよね?
CPX開発に関しては、コンポーネントいらないので、私の方が、cpp+IDE環境作って移行すれば、良いことがありそうですね。
すぐに、ではないですが、目標に設定いたします。

----
YOS

タイトルRe5: ファイルのアップロード
記事No177
投稿日: 2007/03/28(Wed) 15:42
投稿者YOS
#174 うぇいくさん、こんにちは。

>だいじょぶです。慣れれば簡単です(笑)
># httpの直接実装。

DECOさんや、うぇいくさんなら、ですね。(^_^;

># airWebのときに、Multipart対応のために自分で実装しました・・・

今回の場合は、ファイルのアップロード自体はどうでも良くて、ヘッダさえあれば、良いのですが、これしかないですね。

サーバーが、はねつけますから。

----
YOS

タイトルRe6: ファイルのアップロード
記事No178
投稿日: 2007/03/28(Wed) 16:30
投稿者DECO
YOSさん、こんにちは。

>今回の場合は、ファイルのアップロード自体はどうでも良くて、ヘッダさえあれば、良いのですが、これしかないですね。

$F は ファイルの拡張子に合わせて Content-Type を image/jpeg とか image/gif とか application/octet-stream とかを切り替えて追加していますが、$F 以外では追加されません。

___MakePostItemPare を使ってデータを生成した後に、必要な部分に Content-Type を挿入するのが一番簡単かも・・・。あまり綺麗な方法ではありませんけど。

DECO

タイトルRe7: ファイルのアップロード
記事No179
投稿日: 2007/03/28(Wed) 16:33
投稿者DECO
YOSさん、こんにちは。

というか、よくよく考えると$F 以外の項目では「ファイル名」は送信できても「ファイルの内容」は送信されないです・・・・。

ので、やはり自前で実装する必要があるかも・・・。

DECO

タイトルRe8: ファイルのアップロード
記事No185
投稿日: 2007/03/29(Thu) 10:19
投稿者YOS
#179 DECOさん、こんにちは。

>というか、よくよく考えると$F 以外の項目では「ファイル名」は送信できても「ファイルの内容」は送信されないです・・・・。

「CMNは、ファイル送信は一個だけなので、画像は1個しか投稿できません
2個目からの投稿は、自前になるので、ゆっくり検討します。」
と言う注意書きを入れ、逃げを打つ予定です。

>ので、やはり自前で実装する必要があるかも・・・。

(・・)(。。)(・・)(。。)ウンウン
いずれは、やってみたいです。
β公開後になるか、その前かは、まだ決めていません。

----
YOS

タイトルRe9: ファイルのアップロード
記事No189
投稿日: 2007/03/29(Thu) 12:55
投稿者DECO
YOSさん、こんにちは。

>「CMNは、ファイル送信は一個だけなので、画像は1個しか投稿できません
>2個目からの投稿は、自前になるので、ゆっくり検討します。」
>と言う注意書きを入れ、逃げを打つ予定です。

今後CMN側で複数ファイルのアップロードに対応できるような形を検討したいと思います。

DECO

タイトルRe10: ファイルのアップロード
記事No190
投稿日: 2007/03/29(Thu) 15:32
投稿者YOS
#189 DECOさん、こんにちは。

>今後CMN側で複数ファイルのアップロードに対応できるような形を検討したいと思います。

ありがとうございます。
とっても助かります。

----
YOS

タイトルRe7: ファイルのアップロード
記事No184
投稿日: 2007/03/29(Thu) 10:17
投稿者YOS
#178 DECOさん、こんにちは。

>___MakePostItemPare を使ってデータを生成した後に、必要な部分に Content-Type を挿入するのが一番簡単かも・・・。あまり綺麗な方法ではありませんけど。

とりあえず、これで行きました。
MakePostDataを実行後の結果は、文字列になっていたので、これに、必要なデータを挿入し、バイト数を調整(WebParam.cPost)の後、WebParamに格納しました。

一応、詰まっていた部分は、通りました。

次は、MultiPartではない、単純な投稿なので、すんなりいくと思ったら、全角がだめ。
半角英字は通るので、エンコード当たりが、引っかかっている模様。
utf-8にしてみたら、OKでした。

とりあえず、問題の部分は、通過できました。
キーコード取得用のMultiPartは、Bodyにきめうちの「yos」を送りつけるという非道ぶりですが、何とか発言できました。

これで、ゆっくり、自前実装の時間が取れます。

取り急ぎ、ご報告致します。

----
YOS

タイトルRe8: ファイルのアップロード
記事No193
投稿日: 2007/03/29(Thu) 18:56
投稿者YOS
#184 YOSさん、こんにちは。
>とりあえず、問題の部分は、通過できました。

画像が送れませんでした。
実際に画像もアップしてみたら、MakePostDataした後のデータが、うまくStringに取り込めないので、必要なデータが挿入出来ないと言う結果になりました。
どうも、00Hが含まれているらしく、そこで、Stringへの代入が終わってしまうようです。

とりあえず、「画像不可」と言うことで、進める予定です。
現段階では、画像1から3まで、全部$Fを指定するという無茶してます。

メモリ確保して、清く正しくやるしかないかな、と思っていますが。
はてさて。
----
YOS

タイトルRe9: ファイルのアップロード
記事No194
投稿日: 2007/03/29(Thu) 19:11
投稿者うぇいく
>実際に画像もアップしてみたら、MakePostDataした後のデータが、うまくStringに取り込めないので、必要なデータが挿入出来ないと言う結果になりました。
>どうも、00Hが含まれているらしく、そこで、Stringへの代入が終わってしまうようです。
他の枝(?)にもかかれてますが、MultiPartでファイルを添付した場合、通常は、ファイルの中身をそのまま(エンコードとかをせずに)バイナリのまま埋め込みます。だからこそ、Baoundaryという区切が必要になり、WebRequestには、データ長を指定する必要があるのです。
記憶によると、PASCALの文字列(string)は、shortもlong(?)も、Lengthにより管理されていたと記憶していますので、SetLengthかなにかするときに、MakePostDataで生成した長さ+挟み込んだ長さ ではなく、Null-Terminateを基準として長さを取得する関数を使用していませんか?
# なぜ、表現が曖昧なのかと言うと、Pascal良くわからない・・・

# もしくは、Null-TerminateしてしまうAPIなどを呼び出しているか。ちゃんと、意識して持ちまわす(呼び出している関数やAPIは全て仕様を確認する)必要があります・・・というのは、他の枝に書いたとおり。
-- CMN v0.50dβ --

タイトルRe10: ファイルのアップロード
記事No195
投稿日: 2007/03/29(Thu) 19:58
投稿者YOS
#194 うぇいくさん、こんにちは。

>SetLengthかなにかするときに、MakePostDataで生成した長さ+挟み込んだ長さ ではなく、Null-Terminateを基準として長さを取得する関数を使用していませんか?

まさに、これが原因だと思っています。
実は、画像データは、エンコードされた状態で格納されていると思っていましたので、TStringListに放り込んで、処理した新データをString変数に代入した後、バッファに戻していました。
このため、00Hの後ろが切れてしまったようです。

とりあえず、他の確認作業が進まないので、画像無しにして、チェックしています。

AllocMem(メモリの確保)などを使って、きちんとチェックする形式に変更したいと思っています。

----
YOS