2

我正在尝试使用 .Net Core 将文件上传到 VirusTotal。但上传的文件大小为零字节。为什么会发生这种情况?

[Route("api/[controller]")]
public class ScannerController : Controller
{   [HttpGet]         
    public async Task<VirusTotalNet.Results.FileReport> ScanAsync(string file_id)
    {
        file_id = "./wwwroot/Upload/node-v12.14.1-x64.msi";
        VirusTotal virusTotal = new VirusTotal("");
        // virusTotal.UseTLS = true;         
        FileStream stream = System.IO.File.OpenRead(file_id);
        byte[] fileBytes = new byte[stream.Length];
        stream.Read(fileBytes, 0, fileBytes.Length);

        VirusTotalNet.Results.FileReport report = await virusTotal.GetFileReportAsync(stream);

        return report;
    }
}
4

1 回答 1

2

您已经将整个文件读入 abyte[]并且有一个重载GetFileReportAsync会占用它,因此将参数从 更改streamfileBytes

VirusTotalNet.Results.FileReport report = await virusTotal.GetFileReportAsync(fileBytes);

Derviş Kayımbaşıoğlu 建议重置流的位置,但事实证明提到的位置不正确。这些中的任何一个:

stream.Seek(0L, SeekOrigin.Begin);

// or

stream.Position = 0L;

需要在调用之前立即完成GetFileReportAsync文件被读取之后,而不是之前。那会奏效的。

但是等等,还有更多!

无需将文件读入fileBytes,这意味着无需重新设置位置。流可以打开并直接传递给GetFileReportAsync. 包括适当的资源处理,整个方法变成了这样:

[HttpGet]         
public async Task<VirusTotalNet.Results.FileReport> ScanAsync(string file_id)
{
    file_id = "./wwwroot/Upload/node-v12.14.1-x64.msi";
    VirusTotal virusTotal = new VirusTotal("");
    // virusTotal.UseTLS = true;      

    using (FileStream stream = System.IO.File.OpenRead(file_id))
    {
        VirusTotalNet.Results.FileReport report = await virusTotal.GetFileReportAsync(stream);

        return report;
    }
}

这允许异步读取文件和写入套接字,并且可以缓冲少量数据,因此不必将大文件完全加载到内存中。

于 2020-02-25T07:22:02.827 回答