Загруженный файл VirusTotal имеет нулевые байты - PullRequest
2 голосов
/ 25 февраля 2020

Я пытаюсь загрузить файл в VirusTotal, используя. Net Core. Но размер загружаемого файла равен нулю байт. Почему это происходит?

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

1 Ответ

2 голосов
/ 25 февраля 2020

Вы прочитали весь файл в byte[] и существует перегрузка GetFileReportAsync, которая примет это, поэтому измените параметр с stream на fileBytes:

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

Дервиш Каймбашыоглу предложил сбросить позицию потока, но оказалось, что упомянутое местоположение было неправильным. Любой из них:

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

Это позволяет асинхронно читать как файл, так и сокет, и данные могут быть буферизованы в небольших количествах, так что большие файлы не будут не нужно загружать полностью в память.

...