WebAPI文件上载MultipartFormDataStreamProvider清除访问被拒绝

时间:2018-04-26 14:26:24

标签: asp.net-web-api file-upload access-denied

用户上传文件后,我无法清除临时文件 MultipartFormDataStreamProvider。我得到"访问路径' ...'被拒绝"。但是,它可以删除旧的临时文件。

我根据MultipartFormDataStreamProvider Cleanup给出的示例进行清理。

我检查了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 :(得分:0)

我们的网络人员具有读取和执行/读/写访问权限,但没有对App_Data文件夹进行“修改”访问。