如何在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
});
}
如何,何时或在哪里删除这些文件?或者是否有一种方法可以防止文件被写入服务器的磁盘?
类似的问题表明,这种方法通常是有效的。唯一可见的区别是:
- 您正在使用FileInfo。为什么不使用FileInfo的Delete方法呢?
- 您正在使用
S3Helper.Upload(fi.FullName, extension)
。尝试将这行注释掉,以确定它是否锁定了文件。
不确定,但s3helper。上传可能是在后台线程上上传。试试这个
While(true){
try {
// delete file
break;
} catch () {
Thread.Sleep(1000);
}
}
只是看s3文档,是的,它使用的不仅仅是一个后台线程,而是多个!
上传指定文件。对象键由文件名派生。使用多个线程来读取文件并并行执行多个上传。对于大型上传,将使用Amazon S3的多部分API将文件分成几部分进行上传。这些部件将在Amazon S3中重新组装为一个对象。