VirusTotal 上传的文件为零字节

VirusTotal Uploaded File is Zero Bytes

我正在尝试使用 .Net 将文件上传到 VirusTotal Core.But 上传的文件大小为零 Bytes.Why 会发生这种情况吗?

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

您已将整个文件读入 byte[]GetFileReportAsync 的重载将占用它,因此请将参数从 stream 更改为 fileBytes :

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

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