如何在AppData/Temp文件上传后删除文件与.net WebAPI 2?文件使用错误

本文关键字:文件 WebAPI net 错误 删除 AppData Temp | 更新日期: 2023-09-27 18:13:09

我试图在用户将文件上传到我的API后将文件上传到S3。我显然不希望它们存在于我的服务器上,事实上我更希望它们根本不存在于服务器上。我的问题是,这些文件似乎在服务器应用程序的生命周期中仍在使用!下面是代码:

[HttpPost]
public async Task<HttpResponseMessage> Upload()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
    }
    var provider = GetMultipartProvider();
    var result = await Request.Content.ReadAsMultipartAsync(provider);
    var originalFileName = GetDeserializedFileName(result.FileData.First());
    var fi = new FileInfo(result.FileData.First().LocalFileName);
    var extension = Path.GetExtension(originalFileName).ToLower();
    var amazonKey = S3Helper.Upload(fi.FullName, extension);
    // DELETE THE FILE HERE (BodyPart_2f33be26-09a2-4ae3-8b89-4158b99fe32d)
    File.Delete(fi.FullName); // This doesn't work, file in use error...
    return this.Request.CreateResponse(HttpStatusCode.OK, new Img{ 
        Extension = extension,
        S3Key = amazonKey.Key,
        OriginalFilename = originalFileName
    });
}

如何,何时或在哪里删除这些文件?或者是否有一种方法可以防止文件被写入服务器的磁盘?

如何在AppData/Temp文件上传后删除文件与.net WebAPI 2?文件使用错误

类似的问题表明,这种方法通常是有效的。唯一可见的区别是:

  1. 您正在使用FileInfo。为什么不使用FileInfo的Delete方法呢?
  2. 您正在使用S3Helper.Upload(fi.FullName, extension)。尝试将这行注释掉,以确定它是否锁定了文件。

不确定,但s3helper。上传可能是在后台线程上上传。试试这个

While(true){
  try {
     // delete file
     break;
  } catch () {
     Thread.Sleep(1000);
  }
 }

只是看s3文档,是的,它使用的不仅仅是一个后台线程,而是多个!

上传指定文件。对象键由文件名派生。使用多个线程来读取文件并并行执行多个上传。对于大型上传,将使用Amazon S3的多部分API将文件分成几部分进行上传。这些部件将在Amazon S3中重新组装为一个对象。