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 上传的文件为零字节的主要内容,如果未能解决你的问题,请参考以下文章