FileUploadコントロールを使用するWebアプリケーションで作業しています。アップロードしようとしている完全なファイルパス「C:\ Mailid.xls」にxlsファイルがあります。
コマンドを使用するとき
FileUpload1.PostedFile.FileName
システムから完全なファイルパスを取得できません。ただし、別のシステムで上記のコマンドを使用すると、正常に機能します。
また、次のコマンドも試してみましたが成功しませんでした。
System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName);
Path.GetFileName(FileUpload1.PostedFile.FileName);
System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName).ToString();
Convert.ToString(System.IO.Directory.GetParent(FileUpload1.PostedFile.FileName));
フルパスを取得するにはどうすればよいですか?
試して
Server.MapPath(FileUpload1.FileName);
編集:この回答は、サーバー上のファイルへのパスを取得する方法を説明しています。クライアント上のファイルへのパスを取得する方法については説明していません。これが質問の答えです。セキュリティ上の理由から、最新のブラウザではクライアント上のパスが表示されないため、この質問に対する答えは「できません」です。
「currently」というのは、「ファイルをアップロードすると、ブラウザはフルパスではなくソースファイル名のみを送信する」ということです。ファイルが「C:\ WINDOWS \」または「F:\ SOMEDIR\OTHERDIR\PERSONALINFO \」にあるかどうかを知ることはできません。 filenameは常に送信され、ユーザーがコンテンツを「認識」するのに役立ち、ファイルの決定に役立つファイル拡張子を問い合わせるのにも役立ちますタイプ。
ただし、Internet Explorerはを使用して(以前のバージョンでは)パス全体を送信することを間違いなく知っています。正式な確認を見つけることは困難です(これを除く Apache fileupload control doco )
Internet Explorerは、ベースファイル名だけでなく、アップロードされたファイルへの完全なパスを提供します
とにかく、「最新の」ブラウザから送信されるフルパスを使用したり、送信したりすることはできません。
FileUpload
の動作方法を誤解している可能性があります。
ファイルをアップロードすると、クライアントのコンピューターからアプリケーションをホストするサーバーに事実上転送されます。アプリケーションを開発している場合、ほとんどの場合、クライアントとサーバーは同じマシン(コンピューター)です。ただし、アプリケーションがデプロイされると、サーバーに接続するクライアントがいくつあっても、それぞれが異なるファイルをアップロードする可能性があります。
通常、クライアントのコンピューター上のファイルの完全なパスを知る必要はありません。ファイルの内容に対して何かをしたいことがよくあります。あなたの例はASP.NET C#のように見えるので、FileUploadコントロールを使用していると推測しています。アップロードされたファイルのコンテンツを取得するには、生ストリームを読み取る(FileUpload.PostedFile.InputStream
)か、最初にファイルを保存(FileUpload.PostedFile.SaveAs
)してから、保存したファイルにアクセスします。現在の要求後にアクセス可能にする場合は、ファイルを保存する必要があります。保存しない場合は、ASP.NETがファイルを削除します。
もう1つ-フォームのenctype
プロパティを「multipart/form-data」に設定することを忘れないでください。そうしないと、クライアントのブラウザはファイルを送信せず、何が問題なのかと疑問に思う時間がかなり長くなります。
IE8の時点で、フルパスはインターネットゾーンのサイトに送信されなくなりました。
この投稿の最後にある「ファイルアップロードコントロール」セクションを参照してください。 http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection .aspx ディスカッション用。
Convert.ToString(FileUpload1.PostedFile.FileName);
FileUploadは、セキュリティ上の理由から絶対パスを提供しません。
ちょうど私の2セントを与えるために。
この時点で、完全なユーザーのローカルパスも取得します。この問題を再現できるのは1台のマシンのみですが、実際にはユーザーのマシンでファイルの完全なパスが提供されます。
これは、オフサイトサーバーでホストされているアプリケーションのエンドユーザーです。そのため、ローカルマシン上でも、共有の原因となるローカルサーバー上でもありません。
少なくともこれにより、常に同じ動作になるように、問題を解決できます。
Path.GetFileName(fileUpload.FileName)
ところで、ちょうどそれが起こる可能性があるというこの記事を見つけました: http://www.eggheadcafe.com/community/aspnet/17/10092650/fileupload-control-pro.aspx
問題を確認するだけです。
IE 7およびそれ以前のバージョンは、アップロードされたファイルの完全パスをinput type="file"
フィールドに関連するサーバーに送信しました。 Firefoxおよびその他の最新のブラウザーは、これをセキュリティ上の欠陥と見なし、そうではありません。ただし、これはIE 8で修正されているようです。
代わりに、クライアントのシステムにあるファイルへのフルパスが必要な理由を代わりに評価する必要があります。私は、それがまったく投稿されるべきではない、本当に余分な情報だと思います。気にする必要があるのは、ファイル名だけです。名前を変更せずにファイルを保存できます。
元のポスターとは逆の問題がありました。ファイル名だけが必要なときにフルパスを取得していました。 Gabriëlのソリューションを使用してファイル名だけを取得しましたが、その過程で、一部のマシンでフルパスを取得し、他のマシンでは取得しない理由を発見しました。
ドメインに参加しているコンピューターは、ファイル名の完全なパスを返します。いくつかの異なるコンピューターでこれを試し、一貫した結果を得ました。理由の説明はありませんが、少なくとも私のテストでは一貫性がありました。
これにより、一時フォルダー内のファイルがファイル名とともにダンプされます。その後、ファイルを呼び出すことができ、心配する必要はありません。一時フォルダ内に数日間存在すると削除されるためです。
string filename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(),".xls"));
File.WriteAllBytes(filename, FileUploadControl.FileBytes);
これをチェックして:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="FileUp.aspx.vb" Inherits="FileUp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label><br />
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Button ID="Button1" runat="server" Text="Upload" />
</div>
</form>
</body>
</html>
コード:
Partial Class FileUp
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim path As String
Dim path1 As String
path = Server.MapPath("~/")
FileUpload1.SaveAs(path + FileUpload1.FileName)
path1 = path + FileUpload1.FileName
Label1.Text = path1
Response.Write("File Uploaded successfully")
End Sub
End Class
dim path as string = FileUpload1.PostedFile.FileName
ところで、私はVisual Studio 2010を使用しています。他のバージョンとの違いがあるかどうかはわかりません。
IE 8(2台の別々のマシン上)を使用しています。それぞれがまだ完全なローカルファイルパスをアップロードします。 Gabriëlが示唆しているように、Path.GetFileName(fileUploadControl.PostedFile.FileName)は、ファイル名のみを取得することを保証する唯一の方法のようです。
FileUpload Controlでこの投稿を確認してください
また、インターネットゾーンの「ファイルをアップロードするときにローカルディレクトリパスを含める」URLActionが「無効」に設定されています。この変更により、潜在的に機密性の高いローカルファイルシステム情報がインターネットに漏洩することを防ぎます。たとえば、フルパスC:\ users\ericlaw\documents\secret\image.pngを送信するのではなく、Internet Explorer 8はファイル名image.pngのみを送信するようになりました。
有効にできるインターネットセキュリティの下のオプション
IEブラウザを使用する場合、これは問題になりません。これは他のブラウザ用で、別の場所にファイルを保存し、そのパスを使用します。
if(FileUpload1.HasFile)
{
string fileName = FileUpload1.PostedFile.FileName;
string TempfileLocation = @ "D:\ uploadfiles \";
string FullPath = System.IO.Path.Combine(TempfileLocation、fileName);
FileUpload1.SaveAs(FullPath);
Response.Write(FullPath);
}
ありがとうございました
クライアントのマシンでファイルのフルパスを取得することはできません。クライアントとサーバーが同じマシンであり、ファイルがルートディレクトリにあるため、コードはlocalhostで動作する可能性があります。ただし、リモートマシンで実行すると例外が発生します。
Path.GetFullPath(fileUpload.PostedFile.FileName);
申し訳ありませんが、これはプログラムファイルディレクトリとファイル名を取得します。
Internet Explorerのオプションの[セキュリティ]タブで、カスタムセキュリティボタンをクリックして、サーバーにファイルを読み込むときにローカルパスを送信するオプションがあります。
デフォルトでは無効になっています。有効にするだけです。