В загрузке файла WebAPI отказано в доступе к очистке MultipartFormDataStreamProvider - PullRequest
0 голосов
/ 26 апреля 2018

Я не могу очистить временный файл после того, как пользователь загрузил файл, используя MultipartFormDataStreamProvider. Я получаю "доступ к пути" ... "запрещен". Тем не менее, он может удалить старые временные файлы.

Моя очистка основана на приведенном здесь примере Очистка MultipartFormDataStreamProvider .

Я проверил идентичность Windows, и у нее есть доступ на чтение и выполнение / чтение / запись к папке. Я думаю, что-то заблокировано файлом как-то, но я не могу сказать, что. Я пытался переместить удаление до конца и добавить режим сна, но ни один из них не помог.

Как правильно очистить эти файлы? Мне нужно сделать это сразу после того, как я закончу с использованием файла. Там действительно должна быть настройка, чтобы она делала это за вас.

    [HttpPost]
    [Route("UploadFile")]
    public async Task<HttpResponseMessage> UploadFile(string toolToken,
                                                       int Publication_ID,
                                                       string externalKey,
                                                       int dataTypeID,
                                                       int toolProject_ID,
                                                       string cngDesc)
    {
      Logger logger = LogManager.GetCurrentClassLogger();
      logger.Info("application pool user - " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
      try
      {
        string tempDir = Config.ServerTempDataDir; // is ~/App_Data";
        var provider = new MultipartFormDataStreamProvider(tempDir); //using this instead of ReadAsMultipartAsync because of memory constraints
        await Request.Content.ReadAsMultipartAsync(provider);
        MultipartFileData file = provider.FileData.FirstOrDefault(); //only one file is sent
        if (file != null)
        {
          var dir = Path.GetDirectoryName(file.LocalFileName);
          string begStr = Path.GetFileName(file.LocalFileName).Substring(0, 8);

          //will do something with file

          //delete file this fails every time, access denied
          try
          {
            File.Delete(file.LocalFileName);
          }
          catch (Exception e)
          {
            logger.Error("Cleanup Failed" + e.Message);
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e.Message);
          }

          //delete any lingering files - this works
          foreach (var curFilePath in Directory.GetFiles(dir, begStr + "*")) 
          {
            if (File.GetCreationTime(curFilePath) < (DateTime.Now.AddHours(-3)))
            {
              try
              {
                File.Delete(curFilePath);
              }
              catch { }
            }
          }
        }

        var response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue(@"application/json");
        return response;
      }
      catch (Exception e)
      {
        logger.Error("Upload File Exception" + e.Message);
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e.Message);
      }

1 Ответ

0 голосов
/ 01 мая 2018

У наших сетевых пользователей были права на чтение и выполнение / чтение / запись, но у них не было прав доступа "изменить" в папке App_Data.

...