이제 대상 디렉터리를 비우고 응용 프로그램을 다시 실행합니다. 이제 10개의 파일을 동시에 다운로드해야 합니다. 그러나 2 개의 파일만 동시에 다운로드되었습니다. 10 개의 파일이 디스크에 만들어졌지만 2 개만 다운로드되었습니다. 포럼에 여러 파일 다운로드 코드가 첫 번째 파일만 보내는 이유를 묻는 질문이 자주 나타납니다. 일반적으로 코드는 파일 컬렉션을 반복하고 Response.TransmitFile 또는 MVC의 FileResult를 사용하여 각 파일을 클라이언트에 디스패치하는 루프로 구성됩니다. 이것이 작동하지 않는 이유는 기본적으로 불가능하기 때문입니다. 보안상의 이유로 지원되지 않습니다. 이 시나리오를 사용하도록 설정하는 잠재적 인 악용은 악의적인 웹마스터가 요청된 파일 외에 클라이언트에 전체 악성 코드 로드를 보낼 수 있는 드라이브 바이 다운로드라고 합니다. 해결 방법은 파일을 하나의 아카이브 파일로 압축하고 대신 다운로드하는 것입니다. 다양한 타사 zip 라이브러리를 사용하여 이 작업을 수행하는 방법을 보여 주는 몇 가지 예가 있습니다.

.NET 4.5의 System.IO.Compression, 특히 .zip 파일을 만들고 작업할 수 있는 ZipFile 클래스에 몇 가지 새로운 작업이 도입될 때까지 .NET 프레임워크에서 이 작업을 위해 특별히 설계된 것이 없었기 때문입니다. 먼저 웹 서버에 다운로드 할 10 개의 파일을 배치합니다. 그러나 나는 N 아니오를 다운로드 할 수 있습니다. 단일 링크에 있는 파일입니다. 🙁 파일 목록은 ViewBag을 통해 뷰에 전달됩니다: 사용자 선택은 파일 매개 변수에 캡처됩니다. 코드는 archive.zip이라는 파일이 이전 작업에서 존재하고 삭제되는지 확인합니다. 그런 다음 temp라는 폴더가 기존 파일에서 지워집니다. 다음으로 선택한 파일이 소스 디렉터리에서 임시 폴더로 복사됩니다. ZipFile.CreateFromDirectory 메서드는 임시 디렉터리 내용에서 zip 파일을 생성하고 archive.zip으로 저장합니다. 마지막으로 응답에 기록됩니다. 파일. 추가 (newFileItem { 소스 = newUri(src + i.ToString() + 확장), 대상 = dst + i.ToString() + 확장 }); 양식은 다음 코드로 구성된 다운로드라는 작업에 게시합니다.

모든 파일이 생성되지만 2 개만 동시에 다운로드됩니다. 나머지 파일의 크기는 0입니다. 그래서, 우리가 원하는 것은 모든 10 파일을 동시에 다운로드하는 것입니다. 뿐만 아니라 2. 이 솔루션에는 Download.aspx라는 한 페이지가 있습니다. aspx 파일에는 클라이언트를 사용하는 대신 체크박스목록 및 단추 컨트롤에 대한 태그가 포함되어 있습니다. 다운로드파일 사용 클라이언트. 이 같은 DownloadFileAsync 나는 당신이 Zip 파일과 함께하지 않는 한 번에 더 많은 파일을 다운로드 할 수 없습니다 두려워. 결국 타협해야 합니다.

여러 파일을 zip 파일로 다운로드하거나 msi 파일을 다운로드하여 실행할지 선택해야 합니다. CheckBoxList의 DataBound 이벤트를 사용하여 각 항목의 Text 속성을 서식을 지정하여 파일의 전체 경로를 제거했습니다. 양식이 다시 게시된 경우 선택한 항목은 목록 저장되고 동일한 코드가 이전 파일을 지우고 선택한 파일을 임시 폴더에 복사한 다음 zip 아카이브를 생성합니다.