Search code examples
asp.net-web-apifile-uploadaccess-denied

WebAPI File Upload MultipartFormDataStreamProvider cleanup access denied


I am unable to cleanup the temporary file after the user uploads a file using MultipartFormDataStreamProvider. I get "access to the path '...' is denied". However, it can delete old temporary files.

I based my cleanup on the example given here MultipartFormDataStreamProvider Cleanup.

I checked the windows identity and it has Read&Execute/read/write access to the folder. I think, something has locked by the file somehow, but I can't tell what. I tried moving the delete to the end and adding a sleep, but neither helped.

What is the correct way to cleanup these files? I need to do it immediately after I am done using the file. There really should be a setting so it does it for you.

    [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);
      }

Solution

  • Our network guys had Read&Execute/read/write access but did not have "modify" access on the App_Data folder.