gpt4 book ai didi

c# - 如何正确处理临时文件?

转载 作者:太空狗 更新时间:2023-10-29 23:12:08 29 4
gpt4 key购买 nike

问题:我有一个 web api,它公开了一个方法 UploadFile,它将文件从客户端上传到服务器的特定目录。处理请求和上传的代码如下:

var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit);

var reader = new MultipartReader(boundary, HttpContext.Request.Body);

try
{
// Read the form data.
var section = await reader.ReadNextSectionAsync();

// This illustrates how to get the file names.
while (section != null)
{
var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out ContentDispositionHeaderValue contentDisposition);
if (hasContentDispositionHeader)
{

if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
{
targetFilePath = Path.Combine(root, contentDisposition.FileName.ToString());
using (var targetStream = System.IO.File.Create(targetFilePath))
{
await section.Body.CopyToAsync(targetStream);

//_logger.LogInformation($"Copied the uploaded file '{targetFilePath}'");
}
}

我总是使用以下语句调用此方法:

bool res = await importClient.UploadFileAsync(filePath);

其中 UploadFileAsync(位于客户端)以这种方式构建请求:

var requestContent = new MultipartFormDataContent();
var array = File.ReadAllBytes(filePath);
var fileContent = new ByteArrayContent(array);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
requestContent.Add(fileContent, "file", Path.GetFileName(filePath));

如您所见,此方法需要一个文件名/路径才能工作,这意味着该文件必须“存在”在客户端计算机的某个位置。到目前为止,我一直在毫无问题地使用这种方法。我有一个非常具体的案例,我需要在服务器上上传一些用户不想保存在他的客户端上的东西。

可能的解决方案:

  • 我首先想到的是在客户端中手动创建一个文件,并在上传后将其删除。但是我对这个解决方案不是很满意,因为我需要手动处理所有事情

  • 我可以使用 System.IO.Path.GetTempFileName()方法,它将在临时目录中创建一个文件,但我不太确定如何处理文件的取消

  • 我可以使用 TempFileCollection ,但它似乎或多或少地混合了前一点。从技术上讲,我可以在 using 语句中创建此集合,以便在上传完成后将其删除

我对这些主题没有经验,所以我不确定哪种解决方案最适合这种情况

我的要求是我需要 100% 确定文件在上传完成后被删除,并且我希望解决方案是“异步友好的”,即我需要整个过程继续顺利进行。

编辑:我看到了一些困惑。我的问题不是如何处理服务器上的文件。那部分不是问题。我需要处理客户端上的“临时”文件。

最佳答案

一旦你在磁盘上写了一些东西,你就不能 100% 地删除它。而且,即使删除了文件,也不能保证文件不能恢复。

所以你要问我为什么要删除文件。如果它包含一些 secret ,请将其保存在内存中。如果您无法将文件放入内存,请将其加密写入磁盘并仅将 key 保存在内存中。

如果您将 100% 放宽到 99%,我会使用 Path.GetTempFileName 创建一个文件并在 finally block 中将其删除。

如果 99% 还不够,但 99.98% 是,我会将创建的临时文件的名称存储在持久存储中,并定期检查它们是否被删除。

关于c# - 如何正确处理临时文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57770342/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com