0

次のコードを使用して、イメージを IIS 6 (Windows 2003 Server) サイトにアップロードしようとしています。

[HttpPost]
    public ActionResult Edit(Empresas empresas)
    {
        Empresas e = db.Empresas.Where(em => em.Id == empresas.Id).First();
        e.NombreEmpresa = empresas.NombreEmpresa;
        HttpPostedFileBase archivoBanner = Request.Files["Banner"];
        HttpPostedFileBase archivoLogo = Request.Files["Logo"];

        string directorioUpload = Server.MapPath("~/Images/" + e.CodigoEmpresa);
        if (!Directory.Exists(directorioUpload))
        {
            Directory.CreateDirectory(directorioUpload);
        }

        if (archivoBanner != null)
        {
            if (archivoBanner.ContentLength > 0)
            {
                var fileUpload = Path.Combine(directorioUpload, archivoBanner.FileName);
                archivoBanner.SaveAs(fileUpload);
                e.Banner = archivoBanner.FileName;
            }
        }

        if (archivoLogo != null)
        {
            if (archivoLogo.ContentLength > 0)
            {
                var fileUpload = Path.Combine(directorioUpload, archivoLogo.FileName);
                archivoLogo.SaveAs(fileUpload);
                e.Logo = archivoLogo.FileName;
            }
        }

        if (ModelState.IsValid)
        {
            db.Entry(e).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(e);
    }

自分の PC (Windows 8、IE10、Chrome 29) から、または Chrome を使用してサーバーから読み込む場合、問題はありません。IE8 を使用してサーバーからロードすると、「archivoBanner.SaveAs(fileUpload);」で System.UnauthorizedAccessException がスローされ、アプリケーションがソース イメージを読み取れないことが示されます。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.UnauthorizedAccessException: 'C:\Documents and Settings\user\My Documents\Imagenes\banner.png' にアクセスしてください。

ASP.NET は、要求されたリソースへのアクセスを許可されていません。リソースへのアクセス権を ASP.NET 要求 ID に付与することを検討してください。ASP.NET には、アプリケーションが偽装されていない場合に使用されるベース プロセス ID (通常、IIS 5 または IIS 6 および IIS 7 のネットワーク サービスの {MACHINE}\ASPNET、および IIS 7.5 の構成済みアプリケーション プール ID) があります。アプリケーションが を介して偽装している場合、ID は匿名ユーザー (通常は IUSR_MACHINENAME) または認証された要求ユーザーになります。

ファイルへの ASP.NET アクセスを許可するには、エクスプローラーでファイルを右クリックし、[プロパティ] を選択して、[セキュリティ] タブを選択します。[追加] をクリックして、適切なユーザーまたはグループを追加します。ASP.NET アカウントを強調表示し、必要なアクセスのボックスをオンにします。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[UnauthorizedAccessException: Access denegado a la ruta de acceso 'C:\Documents and Settings\user\My Documents\Imagenes\banner.png'.] System.IO.__Error.WinIOError(Int32 errorCode, String MaybeFullPath) +12898791 System.IO .FileStream.Init(文字列パス、FileMode モード、FileAccess アクセス、Int32 権限、Boolean useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath) +2481
System.IO.FileStream.. ctor(文字列パス、FileMode モード、FileAccess アクセス、FileShare 共有、Int32 bufferSize、FileOptions オプション、文字列 msgPath、ブール値 bFromProxy) +229 System.IO.FileStream..ctor(文字列パス、FileMode モード) +106 System.Web.HttpPostedFile .SaveAs(文字列ファイル名) +295
System.Web.Mvc.ReflectedActionDescriptor.Execute( ControllerContext
controllerContext, IDictionary 2 パラメーター) +39 System.Web.Mvc.Async.<>c_ DisplayClass39.b _33() +125 System.Web.Mvc.Async.<>c_ DisplayClass4f.b _49() +452 System.Web.Mvc. Async.<>c_ DisplayClass37.b _36(IAsyncResult asyncResult) +15 System.Web.Mvc.Async.<>c_ DisplayClass2a.b _20() +31 System.Web.Mvc.Async.<>c_ DisplayClass25.b _22( IAsyncResult asyncResult) +2302 parameters) +248
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary



System.Web.Mvc.<>c_ DisplayClass1d.b _18(IAsyncResult asyncResult) +28
System.Web.Mvc.Async.<>c_ DisplayClass4.b _3(IAsyncResult ar) +20 System.Web.Mvc.Controller.EndExecuteCore( IAsyncResult asyncResult) +53
System.Web.Mvc.Async.<>c_ DisplayClass4.b _3(IAsyncResult ar) +20
System.Web.Mvc.<>c_ DisplayClass8.b _3(IAsyncResult asyncResult) +42
System.Web.Mvc .Async.<>c_ DisplayClass4.b _3 (IAsyncResult ar) +20
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) + 375

宛先フォルダーのアクセス許可を変更しようとしましたが、前述のように、ファイルの書き込みではなく読み取りでエラーが発生します。そのため、ファイルのアクセス許可を変更しようとしましたが、同じ結果になりました。

手伝ってくれませんか?

4

2 に答える 2

4

問題は次の行にあると思われます。

var fileUpload = Path.Combine(directorioUpload, archivoBanner.FileName);

絶対パスが含まれている場合archivoBanner.FileName、Path.Combine はその絶対パスを返し、directorioUploadパラメーターを無視します。

次のようなものを試すことができます:

var fileUpload = Path.Combine(
            directorioUpload, 
            Path.GetFileName(archivoBanner.FileName)
            );

問題の説明から、失敗した場合は archivoBanner.FileName に絶対パスが含まれ、成功した場合のみ相対パスまたはファイル名が含まれていると思われます。これは簡単に確認できます。

それは理由ではありません。archivoBanner.Filename にはファイル名のみが含まれ、ディスク内のパスは含まれません。

エラー メッセージは、コードが にアクセスしようとして失敗したことを示していますC:\Documents and Settings\user\My Documents\Imagenes\banner.png。そして、これは疑わしいことに、アップロードされているファイルへのパスのように見えます.

デスクトップから「banner.png」というファイルを試してみると、値は...

これは、PC からアップロードするときに問題がなかったというあなたの声明と一致しています (これは、「デスクトップ」の意味だと思います)。IE8 でサーバーからアップロードする場合は、アップロードされたファイル名をトレースしてみてください。

HttpPostedFile.FileNameのドキュメントには、「クライアント上のファイルの完全修飾名」であると記載されています。セキュリティ上の理由から、特にリモート クライアントの場合、ほとんどのブラウザは完全修飾名を送信しないと思われます。しかし、問題の説明は、IE8がローカルクライアントの場合にそうであることを示唆しています。

于 2013-09-23T19:52:12.110 に答える