C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: asp.net(c#)でファイルをアップロード


(過去ログ 129 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■76618 / inTopicNo.1)  asp.net(c#)でファイルをアップロード
  
□投稿者/ まこと (1回)-(2015/07/28(Tue) 10:26:49)

分類:[ASP.NET (C#)] 

asp.net(c#)でFileUploadコントロール又は
'<input type="file"'タグを使って
ファイルをアップロードをしようとしています。

コードは(例外処理は除いています)
 string filePath = Server.MapPath(".") + imageDir ;
FileUpload1.SaveAs(filePath   + "/" + FileUpload1.FileName);

ブラウザーにIEを指定すると問題なくアップロードされます。
Choromeを指定すると失敗します。
原因はFileUpload1.PostedFile.FileName(アップロードするファイル)に
IEの場合はパスまで含めたファイル名が入りますが、Chromeの場合は
ファイル名しか入りません。

ちなみにFileUploadコントロールをやめて
   <input type="file" name="userfile" />
   <asp:Button id="Button1" runat="server" Text="送信" />
と記述してもinputの中にはChromの場合ファイル名しか表示されません。

基本的に<input type="file"  name="userfile" />タグの
IEとChromeの仕様の差だと思いますが、何か良い方法はありますか。
よろしくお願いします。

引用返信 編集キー/
■76620 / inTopicNo.2)  Re[1]: asp.net(c#)でファイルをアップロード
□投稿者/ WebSurfer (632回)-(2015/07/28(Tue) 11:10:56)
No76618 (まこと さん) に返信

> 原因はFileUpload1.PostedFile.FileName(アップロードするファイル)に
> IEの場合はパスまで含めたファイル名が入りますが、Chromeの場合は
> ファイル名しか入りません。

何かの間違いではないですか?

Fiddler2 などで送信データをキャプチャして中身を見てください。

以下のように、IE も Chrome もサーバーに送信されるのはファイル名(以下の例では 00bce480.jpg)のみになるはずです。

【Chrome 44.0.2403.107 m の場合】

------WebKitFormBoundaryJyhg3rvTYC7lQVUp
Content-Disposition: form-data; name="FileUpload1"; filename="00bce480.jpg"
Content-Type: image/jpeg


【IE9 の場合】

-----------------------------7df29b331604d0
Content-Disposition: form-data; name="FileUpload1"; filename="00bce480.jpg"
Content-Type: image/jpeg

ちなみに、以下の記事のコードで確認しています。

FileUpload と CustomValidator
http://surferonwww.info/BlogEngine/post/2015/03/10/aspnet-fileupload-and-customvalidator.aspx

引用返信 編集キー/
■76623 / inTopicNo.3)  Re[1]: asp.net(c#)でファイルをアップロード
□投稿者/ ぽぴ王子 (30回)-(2015/07/28(Tue) 11:41:15)
ぽぴ王子 さんの Web サイト
No76618 (まこと さん) に返信
IEでも以前はファイルアップロード時にフルパスで送信されることがありました。
http://d.hatena.ne.jp/replication/20100728/1280330386
IE8以降では設定が変更されているようです。

ファイル名にフルパスで入ってしまうと、例えば
C:\Users\PrincePOPI\Documents\test.jpg
のようなファイルをアップロードした場合、クライアントのユーザー名が類推
できてしまうことから、基本的にはファイル名のみ指定されるのが正常な
動作と考えるべきかと思います。

むしろ

>  string filePath = Server.MapPath(".") + imageDir ;
> FileUpload1.SaveAs(filePath   + "/" + FileUpload1.FileName);

このコードを見ると、FileUpload1.FileName にフルパスが入ってしまうと
いろいろと予期せぬ動作をしそうな気がしますが、大丈夫でしょうか。
フルパスが入っていようとファイル名のみ入っていようと、例えば
Path.GetFileName メソッドを使用するなどしてファイル名のみを取得して
操作するようにすべきでしょうね。

引用返信 編集キー/
■76624 / inTopicNo.4)  Re[2]: asp.net(c#)でファイルをアップロード
□投稿者/ WebSurfer (633回)-(2015/07/28(Tue) 12:53:45)
No76623 (ぽぴ王子 さん) に返信

> IEでも以前はファイルアップロード時にフルパスで送信されることがありました。

> IEでも以前はファイルアップロード時にフルパスで送信されることがありました。

そのとおりですね。フォロー有難うございました。

IE8 以降でもイントラネットの場合はフルパスがデフォルトのようですね。

ただ、質問者さんがファイル名を取得しているのは FileUpload.PostedFile.FileName
ではなく FileUpload.FileName なので、そのあたりの問題はないはずなのですが・・・


No76618 (まこと さん) に返信

IE はフルパスで送信するケースがあるのは、ぽぴ王子さんが言われるとおりでした。
間違ったレスですみませんでした。

ただ、以下の記事に書いてあるように "FileName プロパティが返すファイル名には、
クライアント上のファイルのパスが含まれません" ので、ファイル名がフルパスで
送信されても問題はないはずなのですが・・・

FileUpload.FileName プロパティ
https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.fileupload.filename(v=vs.110).aspx

別の問題があるということなのでしょうか。デバッガ等で、

FileUpload1.SaveAs(filePath + "/" + FileUpload1.FileName);

のパスが期待通りになっているか調べてみてはいかがですか?

引用返信 編集キー/
■76625 / inTopicNo.5)  Re[3]: asp.net(c#)でファイルをアップロード
□投稿者/ まこと (2回)-(2015/07/28(Tue) 13:11:39)
WebSurferさん、ぽぴ王子さんありがとうございます。

同じコードで、IEは問題なくUpLoad出来て、Chromeは
出来ません。

フルパスが入るのは
FileUpload1.PostedFile.FileName で
FileUpload1.FileNameでは有りません。

送信データの
Content-disposition: attachment; filename="ファイル名"
のfilenameに入るのはFileUpload1.FileNameでこれには
パスは付きません。

FileUpload1.PostedFile.FileName
をMSDNで見ると
「Gets the fully qualified name of the file on the client.」
となっています。
「fully qualified name」がフルパス付のファイル名と訳してよいか
否かは不明ですが。
多分これを見てクライアント側は送るデータを作成すると思うのですが。

Visual Studioでブレークをかけて値をのぞくと、IEの場合はフルパス付の
名前が、Chromeの場合は、パスなしの名前だけが入っています。

FileUpload1.SaveAs(filePath + "/" + FileUpload1.FileName);
この「filePath + "/" + FileUpload1.FileName」はサーバー側の
フォルダー+ファイル名になります。

引用返信 編集キー/
■76628 / inTopicNo.6)  Re[4]: asp.net(c#)でファイルをアップロード
□投稿者/ まこと (3回)-(2015/07/28(Tue) 14:08:53)
大変失礼しました。
FileUpload1.PostedFile.FileName
は書いた通りですが、ChromeでもUpLoad出来るように
なりました。
原因は不明ですが、何かの設定が変わったようです。
原因が分かりましたら書き込みます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -