- PR -

HTTPによるファイルアップロードを実現するには?

1
投稿者投稿内容
のり
会議室デビュー日: 2002/06/04
投稿数: 12
投稿日時: 2002-06-04 11:26
HTTPを利用してファイルのダウンロード、アップロードを実現したいと考えています。
(WebサーバーはIIS5.0です)

ダウンロードについては、WebRequestクラス、WebResponseクラスを利用してサンプルコードを作成し、意図した通りに動作することを確認しました。
また、WebClientクラスを利用したサンプルでも同様にファイルダウンロードを実現できました。(但し、WebClientクラスは設定できるオプションが少ないためにプロキシサーバーを経由した接続の方法がわかっていません)

次にファイルアップロード機能について検討していますが、これがうまく構築できないでいます。
これまでの私の経験では、HTTPによるファイルアップロード機能を実現するのに「アップロードCGI」をC言語で作成していました。
クライアントプログラムは、そのCGIに対してPOSTメソッドを発行することでファイルの内容を転送し、アップロードCGIがその内容をファイルに書き出すというものです。

ですから、HTTPによるファイルアップロード機能を実現するには、サーバー側に「アップロードCGI」相当するものを用意する必要があるのではないかと考えています。
ASP.NETでこのような機能を提供するにはどのようなページを構築すればよいのでしょうか?

また、WebClientクラスにはUploadFileというメソッドが用意されています。
このメソッドの機能は、あたかもサーバー側には何も用意せずともファイルアップロードが実現できるように思わせるものですが、実際にはうまく動作しません。
(というよりも正しい使い方がわかりません)

長くなりますが、もう一つつかんでいる情報を記しておきます。
クライアントがIEである場合、ファイルアップロード用のHTML(aspx)を作成することが可能です。
(MSDN - HtmlInputFileクラスの「使用例」にサンプルが記載されています)
この場合は、クライアントがブラウザであり、ユーザーがForm上のボタンを押すことによってファイルアップロードが処理されます。
しかし今回はクライアントはブラウザでなく、またイベントドリブンで処理が行われることも想定していないのです。

このような状況ですが、何か良い方法をご存知の方いらっしゃいませんでしょうか。
Komorebi
会議室デビュー日: 2002/05/30
投稿数: 3
投稿日時: 2002-06-04 11:55
うーん、違っていたらすいませんが。
以前、私はずっとこれを使ってました。

http://www.hi-ho.ne.jp/babaq/
Komorebi
会議室デビュー日: 2002/05/30
投稿数: 3
投稿日時: 2002-06-04 13:01
宣伝ではないのですが。
急いでたので、途中できれちゃいました。すいません。

BASP21っていうフリーのツールなのですが、ASPだけでは難しい処理も
対応しています。
具体的にはメールの送受信・ファイルのアップロードなど。
たしか、企業じゃなければ、ライセンスフリーだったと思います。

くわしくは、
http://www.hi-ho.ne.jp/babaq/faq.html
biac
大ベテラン
会議室デビュー日: 2001/10/22
投稿数: 106
投稿日時: 2002-06-04 14:28
引用:

クライアントプログラムは、そのCGIに対してPOSTメソッドを発行することでファイルの内容を転送し、アップロードCGIがその内容をファイルに書き出すというものです。



POST する内容がマルチパート MIME 形式ならば、HttpFileCollection オブジェクトで出来るのでは?
ms-help://MS.VSCC/MS.MSDNVS.1041/cpref/html/frlrfsystemwebhttprequestclassfilestopic.htm

HttpPostedFile.InputStream のところに、バイト配列に入れるところまでのサンプルが載ってます。 あとはファイルに書き出すだけですね。
ms-help://MS.VSCC/MS.MSDNVS.1041/cpref/html/frlrfsystemwebhttppostedfileclassinputstreamtopic.htm
のり
会議室デビュー日: 2002/06/04
投稿数: 12
投稿日時: 2002-06-05 17:30
biacさん、Komorebiさん、貴重な情報をありがとうございました。
その後、いろいろと調査をしまして、私が抱えていた問題がある程度解決しましたのでお知らせします。

WebClient.UploadFileメソッドを使用します。
最初このメソッドで動作確認したときには例外が発生してしまい、これまでその理由がわかりませんでした。

この現象の原因は、サーバー側のディレクトリセキュリティにありました。
つまりファイルをアップロードする先のディレクトリセキュリティです。
IISの設定でディレクトリに対する書き込みを許可するかどうかを設定できます。
ですが、これだけでは足りないようで、私のテスト環境の場合はエクスプローラからディレクトリのセキュリティを変更してやる必要がありました。
(EveryOneの権限に「書き込み」許可を追加しました)
つまり、プログラムではなく、環境設定の問題だったのです。
このようにすることでUploadFileメソッドが機能することを確認することができました。

但し、どういうわけかサーバー側に作成されたファイル中に余計な情報が付加されてしまいます。
この現象については解決していないのですが、参考になりそうな情報は見つけました。

http://www.dotnet247.com/247reference/msgs/18/92068.aspx


さらに WebRequestクラスを利用したファイルUploadの方法も検討中です。
こちらのほうがやや手続きは面倒なのですが、逆に細かい制御が可能になっていて、アプリケーションを構築する場合には何かと融通が利いて都合がよいと思われます。

ファイル転送の仕組みまでは作成できていないのですが、サーバー側にファイルを作成するサンプルは出来ていますので、コードを載せておきます。


string MyUri;
WebRequest WReq;
Stream RequestStream;
byte[] SomeBytes;
string payload;

MyUri = "http://localhost/upload/test.txt";
payload = "Data to be sent to the server";

WReq = WebRequest.Create(MyUri);

SomeBytes = System.Text.Encoding.ASCII.GetBytes( payload );

WReq.Method = "POST";
WReq.ContentType = "application/x-www-form-urlencoded";
WReq.ContentLength = SomeBytes.Length;

RequestStream = WReq.GetRequestStream();
RequestStream.Write(SomeBytes, 0, SomeBytes.Length);
RequestStream.Close();


これによりサーバ側に "test.txt" というファイルが作成されます。
ファイルの中身は "Data to be sent to the server" という文字列になります。


このような状況ですので、当初抱えていた問題はだいたいクリアされました。
しかしながら、上記のような方法がスマートな方法なのか、もっと他に解決策がないのかという点についてはとても興味があります。


何かご意見などありましたら、教えていただけますでしょうか。
よろしくお願いします。


のり
会議室デビュー日: 2002/06/04
投稿数: 12
投稿日時: 2002-06-05 18:06
先ほどの投稿に間違った情報が含まれていましたので訂正します。
WebRequestクラスを使用したサンプルですが、

WReq.Method = "POST";

というようにPOSTメソッドを指定していました。
しかしながら私の環境では、PUTメソッドでないと正常に動作しないようです。
POSTメソッドを指定すると

「(405) メソッドは使用できません」

という例外が発生してしまいます。
よって、

WReq.Method = "PUT";

というようにしないと正常に動作しません。

また、WebClient.UploadFileメソッドでも同様のことが適用されます。
UploadFileメソッドには、引数にメソッド動詞を指定できるようになっています。

WebClient myWebClient = new WebClient();
myWebClient.UploadFile(uriString,"POST",fileName);

やはり、この例のようにPOSTメソッドを指定してしまうと例外が発生します。
PUTメソッドを指定した場合は、Upload処理が実行されます。


そもそも私が作成したサンプルコードは、MSDNのサンプルやMSのサイトの技術ドキュメントを参考にしました。
それらのサンプルでは "POST" が指定されています。
この「ずれ」はいったい何が起因しているのでしょうか?
やはりサーバー側の設定が何か足りないのでしょうか?

1

スキルアップ/キャリアアップ(JOB@IT)