Çok benzer bir sorunu çözmeye çalışıyordum ve bellek taramasında fazla bir şey bulamadım. Bulduğum çoğu örnek dosyayı diske yazmayı ve sonra da dosyayı diskte taramak için başka bir işleme geçirerek bazı değişkenleri taramaktır.
Kullandığım çözümde sadece HttpPostedFileBase.InputStream
kullanın ve taramak için bunu ClamAv'a gönderin. MVC ve QED'de çalışmak için çok fazla kod yok. VirusScannerFactory Uygulanması AV satıcısına uygun uzatılabilir
/// Main controller
public class HomeController : Controller {
/// Get the upload view
[HttpGet]
public ActionResult Index() {
return View();
}
/// Handle the file upload
[HttpPost]
public ActionResult Index(UploadViewModel model, HttpPostedFileBase file) {
var scanner = VirusScannerFactory.GetVirusScanner();
var result = scanner.ScanStream(file.InputStream);
if(result.IsVirusFree) {
// save to disk
} else {
// don't save to disk and tell user they uploaded a virus
}
return View(model);
}
}
:
Yani MVC denetleyicisi, böyle bir şey olacak.
public class VirusScannerFactory {
public static IScanViruses GetVirusScanner() {
//Currently we only have one Antivirus implementation,
//but later we want to include AVG, SOPHOS and metascan
return new ClamAvScanner();
}
}
public interface IScanViruses {
ScanResult ScanFile(string fullPath);
ScanResult ScanBytes(byte[] bytes);
ScanResult ScanStream(Stream stream);
}
Örnek olarak nClam ve ClamAv kullandım. Tam ClamAv uygulanması found on github olabilir, ama bunun bellek için çalışma akışları almak nasıl bir pasajı ben Clamav ile bunun nasıl yapılacağı tam detayları ile blog post oluşturulan
public class ClamAvScanner : IScanViruses{
... snip ...
/// Scans your data stream for virus
public ScanResult ScanStream(Stream stream) {
var clam = new ClamClient("localhost", 3310);
return MapScanResult(clam.SendAndScanFile(stream));
}
...snip ...
/// helper method to map scan result
private ScanResult MapScanResult(ClamScanResult scanResult) {
var result = new ScanResult();
switch (scanResult.Result) {
case ClamScanResults.Unknown:
result.Message = "Could not scan file";
result.IsVirusFree = false;
break;
case ClamScanResults.Clean:
result.Message = "No Virus found";
result.IsVirusFree = true;
break;
case ClamScanResults.VirusDetected:
result.Message = "Virus found: " + scanResult.InfectedFiles.First().VirusName;
result.IsVirusFree = false;
break;
case ClamScanResults.Error:
result.Message = string.Format("VIRUS SCAN ERROR! {0}", scanResult.RawResult);
result.IsVirusFree = false;
break;
}
return result;
}
}
altındadır.
Merhaba, bu çalışmayı nasıl başardığınızı ve en iyi bulduğunuz çözümü nasıl bulabileceğinizi merak ediyordum. –
IAttachmentExecute API'sini kullanabilirsiniz. [Bu yanıt size yardımcı olabilir] (http://stackoverflow.com/a/35684198/1442180) – Fred
IAttachmentExecute API'sini kullanabilirsiniz. [Bu cevap size yardımcı olabilir] (http: // stackoverflow.com/a/35684198/1442180) – Fred