服务器错误 - 无法找到路径'C:\ home \ site \ wwwroot \ App_Data \ Temp \ 1.png'

时间:2017-02-14 19:27:52

标签: c# asp.net asp.net-mvc file asp.net-mvc-4

我在尝试将图片上传到我的网站时收到以下错误。

  应用程序中的服务器错误。

     

无法找到路径的一部分   'C:\家\站点\ wwwroot的\程序App_Data \ TEMP \ 1.png'。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.IO.DirectoryNotFoundException:无法   找到路径'C:\ home \ site \ wwwroot \ App_Data \ Temp \ 1.png'的一部分。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[DirectoryNotFoundException:找不到路径的一部分   'C:\家\网站\ wwwroot的\ App_Data文件\ TEMP \ 1.png'。]
  System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)   +353 System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,   Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,   String msgPath,Boolean bFromProxy,Boolean useLongPath,Boolean   checkHost)+1326 System.IO.FileStream..ctor(String path,FileMode   模式,FileAccess访问,FileShare共享,Int32 bufferSize,   FileOptions选项,String msgPath,Boolean bFromProxy)+60
  System.IO.FileStream..ctor(String path,FileMode mode)+55
  System.Web.HttpPostedFile.SaveAs(String filename)+94
  System.Web.HttpPostedFileWrapper.SaveAs(String filename)+14
  RoomAuditSystem.Controllers.HomeController.Index(HttpPostedFileBase   文件)+96 lambda_method(Closure,ControllerBase,Object [])+104   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase   controller,Object []参数)+14
  System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext   controllerContext,IDictionary 2 parameters) +157
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2   参数)+27
  System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult的   asyncResult,ActionInvocation innerInvokeState)+22
  System.Web.Mvc.Async.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult的   asyncResult)+32
  System.Web.Mvc.Async.AsyncInvocationWithFilters.b__3d()   +50 System.Web.Mvc.Async。<> c__DisplayClass46.b__3f()   +225 System.Web.Mvc.Async。<> c__DisplayClass33.b__32(IAsyncResult asyncResult)+10
  System.Web.Mvc.Async.WrappedAsyncResult 1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult的   asyncResult)+34
  System.Web.Mvc.Async<> c__DisplayClass2b.b__1c()   +26 System.Web.Mvc.Async。<> c__DisplayClass21.b__1e(IAsyncResult)   asyncResult)+100
  System.Web.Mvc.Async.WrappedAsyncResult 1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult的   asyncResult)+27
  System.Web.Mvc.Controller.b__1d(IAsyncResult的   asyncResult,ExecuteCoreState innerState)+13
  System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+36   System.Web.Mvc.Controller.b__15(IAsyncResult的   asyncResult,控制器控制器)+12
  System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +22
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)+26
  System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult的   asyncResult)+10
  System.Web.Mvc.MvcHandler.b__5(IAsyncResult的   asyncResult,ProcessRequestState innerState)+21
  System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+49
  System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)   +28 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult)   结果)+9
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +9744373 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+155

以下是处理此问题的代码部分:

[HttpPost]
    public ActionResult Index(HttpPostedFileBase file)
    {
        if (file.ContentLength > 0)
        {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data/Temp"), fileName);
            file.SaveAs(path);

            // create a barcode reader instance
            IBarcodeReader reader = new BarcodeReader();
            // load a bitmap
            Bitmap bitmap = new Bitmap(path);

            Bitmap resized = new Bitmap(bitmap, new Size(400, 400));

            // detect and decode the barcode inside the bitmap
            var result = reader.Decode(resized);

            bitmap.Dispose();

            // Delete file once we have finished with it
            if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
            }

            // do something with the result
            if (result != null)
            {
                return RedirectToAction("Create", "Audit", new { roomID = result.Text });
                //txtDecoderType.Text = result.BarcodeFormat.ToString();
            }

            // Decode error
            else
            {
                return RedirectToAction("Index");
            }
        }

        // File error
        else
        {
            return RedirectToAction("Index");
        }      
    }

它在我的本地计算机上工作正常,但在我在线发布时似乎没有工作。我肯定有一个名为App_Data的目录和我网站根目录中名为Temp的另一个目录。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

例外是明确的。该路径的一部分并不存在。重要的是,App_Data在发布过程中不会包含在内,因此它只是因为它存在于您的项目本地,并不意味着它实际上存在于您的生产服务器上。除此之外,检查整个路径,即您必须在C驱动器上直接有一个home目录,该目录必须有site目录等。

同样,如果一切正常,那就没有办法得到那个例外。该路径的某些部分不正确或不存在。

答案 1 :(得分:0)

通过克里斯的解释管理解决这个问题。即使我在整个应用程序旁边发布了文件夹'Temp'也不存在。我假设因为这个文件夹是空的,它没有与其他所有内容一起发布。所以我手动发布了这个单独的文件夹,嘿presto - 它的工作原理!