- PR -

ファイルアップロード

1
投稿者投稿内容
ポーター
ベテラン
会議室デビュー日: 2005/02/03
投稿数: 50
投稿日時: 2005-08-12 00:27
ASP.NET(C#)でファイルのアップロードについてお教えください。

ある書籍に記載されていたソースを利用しファイルのアップロードを
ためしているのですが、
下記ソースの
Div1.InnerText = f.Name;
のところで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
とエラーが出ます。ファイル名がちゃんと指定されていないのが原因ではないかと
思うのですが、未熟者の為、解決方法がわかりません。お分かりになる方がいらっしゃい
ましたらお教えください。

ファイルの参照にはツールボックスの「HTML」カテゴリーの「File Field」と
HTMLサーバコントロールを利用しています。


###以下ソースです。

protected System.Web.UI.WebControls.Button Button5;
protected System.Web.UI.HtmlControls.HtmlGenericControl Div1;
protected System.Web.UI.HtmlControls.HtmlGenericControl Div2;
protected System.Web.UI.HtmlControls.HtmlGenericControl Div3;
protected System.Web.UI.HtmlControls.HtmlInputFile File1;

private void Button5_Click(object sender, System.EventArgs e)
{
HttpPostedFile file = File1.PostedFile;
System.IO.FileInfo f = new System.IO.FileInfo(file.FileName);
Div1.InnerText = f.Name;
Div2.InnerText = file.ContentType;
Div3.InnerText = file.ContentLength.ToString();

System.IO.BinaryWriter writer = new System.IO.BinaryWriter(System.IO.File.Create(Server.MapPath("/img/" + f.Name)));
byte[] tmp = new byte[4096];
System.IO.Stream fin = file.InputStream;
while((fin.Read(tmp, 0, 4096) != 0))
writer.Write(tmp);
writer.Close();

}

[ メッセージ編集済み 編集者: みゅみゅ 編集日時 2005-08-12 00:28 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-08-12 07:12
引用:

みゅみゅさんの書き込み (2005-08-12 00:27) より:

ある書籍に記載されていたソースを利用しファイルのアップロードを


 『ある書籍』ではなく、書名やISBN、Amazonなどの書店へのリンクなど、書籍を限定してください。また、ページ番号や章番号まで書くようにしてください。
 引用されているものでは動かすことが出来ません。実際に動かして、試すために必要な情報です。

引用:

下記ソースの
Div1.InnerText = f.Name;
のところで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
とエラーが出ます。ファイル名がちゃんと指定されていないのが原因ではないかと
思うのですが、未熟者の為、解決方法がわかりません。


 このエラー(ヌルポと呼ばれたりします)の場合、どのオブジェクトが無いのか、はっきりさせてください。対象の行では、DIV1 というオブジェクトと、f というオブジェクトの2つがあります。どちらかが NULL (VB では Nothing)になっています。どちらか、はっきりさせてください。

 コードを見ると、おそらく f の方だと思うのですが、、、
> System.IO.FileInfo f = new System.IO.FileInfo(file.FileName);
ファイルのアップロードですよね?このコードは、クライアント、サーバの、どちらで動いていますか?

 アップロードと言うことは、ファイルはクライアントにあって、サーバにはないはずです。そのため、FileInfo ではとれないと思うのですが???
_________________
ポーター
ベテラン
会議室デビュー日: 2005/02/03
投稿数: 50
投稿日時: 2005-08-12 08:42
Jitta様 失礼しました。情報不足でした。

書籍は
技術評論社出版の「C#.NET プログラミングマニュアル」です。273ページになります。
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1553-3

ASP.NET(C#)を利用しており、
コードはサーバ側に置いています。
アップロードを行いたいファイルは画像ファイルで、クライアントから
ブラウザーでアップロードすることになります。

ブラウザーに表示されるエラーは下記となります。
(エラー表示のディレクトリパスは変更させて頂いています。)
###

オブジェクト参照がオブジェクト インスタンスに設定されていません。

説明 : 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

ソース エラー:


行 187: HttpPostedFile file = File1.PostedFile;
行 188: System.IO.FileInfo f = new System.IO.FileInfo(file.FileName);
行 189: Div1.InnerText = f.Name;
行 190: Div2.InnerText = file.ContentType;
行 191: Div3.InnerText = file.ContentLength.ToString();


スタック トレース:


[NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。]
admin.edit.Button5_Click(Object sender, EventArgs e) in \\\\aaaa\\bbb$\\cccc\\ddd\\edit.aspx.cs:189
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain() +1277

######
以上がエラー情報です。
オブジェクトのDIV1とfのどちらが原因かははっきり書かれておりません。

ファイル名の取得方法とFileInfoについて調べてみます。

よろしくお願いいたします。


[ メッセージ編集済み 編集者: みゅみゅ 編集日時 2005-08-12 08:58 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-12 09:12
引用:
MSDN, HttpPostedFile クラス の解説より:

HttpPostedFile には、個別のファイルに関する情報を取得するためのプロパティとメソッド、およびそのファイルを読み込み、保存するためのプロパティとメソッドが用意されています。ファイルは、MIME multipart/form-data 形式でアップロードされ、ディスクに明示的に保存されるまでサーバーのメモリにバッファされます。


の解説通り、この時点ではファイルはサーバのディスクに存在しません。あくまでメモリに存在するだけです。
ですからFileInfoで情報を取ることはできません。
一度しっかりHttpPostedFileクラスをよく調べてみましょう。


引用:
オブジェクトのDIV1とfのどちらが原因かははっきり書かれておりません。


それを調べるのがデバッグの第一歩なのですが。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-08-12 10:46
HttpPostedFileクラス型のオブジェクト(例のソースだとFile1.PostedFileで取れるオブジェクト)のSaveAs()メソッドを使って一旦サーバーのローカルディスク領域に保存したりすると良いんじゃないでしょうか。
InputStreamプロパティでも読めるのかな。

引用:

Jittaさんの書き込み (2005-08-12 07:12) より:
 このエラー(ヌルポと呼ばれたりします)



.NETでは"ぬるり"じゃないんでしょうか。
1

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