HttpPostedFile.SaveAs () выбрасывает UnauthorizedAccessException, даже если файл сохранен? - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть страница aspx с несколькими FileUpload элементами управления и одна кнопка загрузки. В обработчике кликов я сохраняю файлы так:

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, логические права использования, Общий доступ к FileShare, размер буфера Int32, Опции FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) в System.IO.FileStream..ctor (String путь, режим FileMode, FileAccess доступ, общий доступ к FileShare, Int32 bufferSize, параметры FileOptions, Строка msgPath, логическое bFromProxy)
at System.IO.FileStream..ctor (String путь, режим FileMode) в System.Web.HttpPostedFile.SaveAs (String имя файла) в Belden.Web.Intranet.Iso.Complaints.AttachmentUploader.btnUpload_Click (Объект отправитель, EventArgs e) в System.Web.UI.WebControls.Button.OnClick (EventArgs есть System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler sourceControl, String eventArgument)
в System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- Конец внутренней трассировки стека исключений --- в System.Web.UI.Page.HandleError (Exception есть System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) в System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean 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 шаг, логическое и завершено синхронно)

Теперь вот самое интересное. Файл сохранен правильно! Так почему же это исключение?

Обновление

Я исправил это, проверив ненулевое 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);
}

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

попробуйте использовать

file.SaveAs(server.mappath(saveAsPath));

2 голосов
/ 16 апреля 2010

Я исправил это, проверив ненулевое 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);
}

Иногда это простые вещи, которые я упускаю из виду ...

1 голос
/ 16 апреля 2010

Интересно ... мой первый вопрос: вы абсолютно уверены, что на самом деле строка кода вызывает исключение?

Два ... это исчезнет, ​​если вы (временно) предоставите всем доступ к этому пути?

Как настроены ваши разрешения сейчас? Какой пользователь работает с ASP.NET? Вы используете олицетворение?

...