VirusTotal 上传的文件为零字节

Posted

技术标签:

【中文标题】VirusTotal 上传的文件为零字节【英文标题】:VirusTotal Uploaded File is Zero Bytes 【发布时间】:2020-06-08 20:36:18 【问题描述】:

我正在尝试使用 .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;
    

【问题讨论】:

你能在stream.read之前试试stream.Seek(0, SeekOrigin.Begin)吗? @DervişKayımbaşıoğlu 试过了.. 又是同样的问题virustotal.com/gui/file/… @DervişKayımbaşıoğlu,如果它被插入到报告行之前,它应该可以按您的预期工作...... 【参考方案1】:

您已将整个文件读入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;
    

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

【讨论】:

以上是关于VirusTotal 上传的文件为零字节的主要内容,如果未能解决你的问题,请参考以下文章

ftp上传文件失败,长传文件大小为零字节!

节点强大的创建大小为零字节的不必要文件

Virus.Win32.Virlock.b分析

如何使用 C# 中的 VirusTotal.NET 库查找文件是不是被病毒感染?

流星cfs:文件系统从ios上传到服务器导致零字节文件

使用 C# 将文件上传到 FTP