У меня есть страница aspx с несколькими элементами управления FileUpload
и одна кнопка «Загрузить». В обработчик щелчка я сохранить файлы, как это:HttpPostedFile.SaveAs() выбрасывает UnauthorizedAccessException, даже если файл сохраняется?
string path = "...";
for (int i = 0; i < Request.Files.Count - 1; i++)
{
HttpPostedFile file = Request.Files[i];
string fileName = Path.GetFileName(file.FileName);
string saveAsPath = Path.Combine(path, fileName);
file.SaveAs(saveAsPath);
}
Когда file.SaveAs()
называется, он бросает:
System.Web.HttpUnhandledException: Исключение типа 'System.Web.HttpUnhandledException' был брошен. ---> System.UnauthorizedAccessException: Доступ к трассе '...' отрицается. в System.IO .__ Error.WinIOError (Int32 ERRORCODE, String maybeFullPath) на System.IO.FileStream.Init (Строка пути, режим FileMode, FileAccess доступа, Int32 прав, булевы useRights, Обменник акций, Int32 BufferSize , FileOptions варианты, SECURITY_ATTRIBUTES secAttrs, Строка msgPath, Boolean bFromProxy) в System.IO.FileStream..ctor (String путь, режим FileMode, FileAccess доступа, Обменник доля, Int32 BufferSize, опции FileOptions, Строка msgPath, Boolean bFromProxy)
на System.IO.FileStr eam..ctor (String путь, режим FileMode) при System.Web.HttpPostedFile.SaveAs (Строка файла) при Belden.Web.Intranet.Iso.Complaints.AttachmentUploader.btnUpload_Click (Объект отправителя, EventArgs е) в System.Web.UI.WebControls.Button.OnClick (EventArgs е) в System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler SourceControl , String eventArgument)
at System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- Конец внутренней трассировки стека исключений --- в System.Web.UI.Page.HandleError (исключение е) при System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, булева includeStagesAfterAsyncPoint) при System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, булева includeStagesAfterAsyncPoint) при System.Web.UI.Page.ProcessRequest()
на System.Web.UI.Page.ProcessRequest (HttpContext ) в ASP.departments_ iso_complaints_uploadfiles_aspx.ProcessRequest (HttpContext контекст) на System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() в System.Web.HttpApplication.ExecuteStep (IExecutionStep шаг, булева & completedSynchronously)
Теперь вот забавная часть. Файл сохранен правильно! Так почему это бросает это исключение?
Update
Я установил ее, проверяя, не равного нулю ContentLength:
string path = "...";
for (int i = 0; i < Request.Files.Count - 1; i++)
{
HttpPostedFile file = Request.Files[i];
if (file.ContentLength == 0)
{
continue;
}
string fileName = Path.GetFileName(file.FileName);
string saveAsPath = Path.Combine(path, fileName);
file.SaveAs(saveAsPath);
}
Попробуйте удалить/перемещение файла с того места, где оно сохраняется, и загрузить его снова. В этом случае ошибка все еще возникает? – shahkalpesh
Я только что повторил код ... Ошибка произошла, когда один из элементов управления FileUpload не имел пути. Он по-прежнему создает экземпляр HttpPostedFile, но ContentLength равен 0, а FileName пуст. Doh! – jrummell