2011-01-16 6 views
0

브라우저를 통해 서버 측에서 여러 파일을 다운로드 할 수 있습니다. (예 : Chrome) foreach가 반복적으로 디버깅을 수행했지만 첫 번째 파일 만 다운로드합니다. 내가 좌절감을 느끼고 있기 때문에 어떤 제안이라도 크게 환호 할 것입니다.C# 브라우저를 통해 서버 측에서 배수 파일을 다운로드합니다.

FileInfo fInfo; 
    SQLConnection = new SqlConnection(SQLConnectionString); 
    foreach (CartItem CartProduct in Cart.Instance.Items) 
    { 
     SQLCom = new SqlCommand("spSelect_T", SQLConnection); 
     SQLCom.CommandType = CommandType.StoredProcedure; 
     SQLCom.Parameters.Add(new SqlParameter("@id", CartProduct.ProductId));   
     SQLConnection.Open(); 
     SQLDReader = SQLCom.ExecuteReader(); 
     if (SQLDReader.Read() == true) 
     { 
      fInfo = new FileInfo(Server.MapPath(SQLDReader["t_path"].ToString())); 
      Response.Clear(); 
      Response.Expires = -1; 
      Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fInfo.Name + "\""); 
      Response.AddHeader("Content-Length", fInfo.Length.ToString()); 
      Response.ContentType = "application/octet-stream"; 
      Response.WriteFile(fInfo.FullName); 
      Response.End(); 
     } 
     SQLConnection.Close(); 
    } 
+0

응답 스트림에서 한 번에 하나의 파일 만 보낼 수 있습니다. 그래서 그들을 gzip 수 있습니다. –

답변

2

Scriptworks, 당신은 프로토콜 작동 방식에 맞서 싸우고 있습니다. ASP/PHP 또는 기타 웹 프레임 워크를 사용하는지 여부는 중요하지 않습니다. 특정 요청에 대해서만 한 세트의 헤더와 본문 스트림을 보낼 수 있습니다. 귀하의 선택은 제한되어 있습니다.

파일의 경우 HTTP 요청 당 하나의 파일 만 전송할 수 있습니다. 단일 응답 파일을 작성하기 위해 Zipping과 같은 다른 제안이 작동하지 않는 경우, 유일한 대안은 클라이언트가 여러 요청을 수행하도록하는 것입니다.

아마도 가장 쉬운 방법은 AJAX 또는 숨겨진 IFRAME에서이 작업을 수행하는 것입니다.

먼저 파일 이름을 가져 와서 헤더와 파일 스트림을 반환하거나 파일이있는 정적 파일 웹 서버를 콘텐츠 디렉토리에 반환해야하는 처리기가 있어야합니다.

AJAX의 경우 클라이언트 스크립트에 파일 URL 목록을 보내 스크립트에서 목록을 반복하여 각 URL을 차례로 요청할 수 있습니다.

서버 또는 스크립트를 사용하여 src 속성이 파일의 URL로 설정된 IFRAME을 생성합니다.

이러한 솔루션 중 어느 것도 "꽤"사용자 경험이 아닙니다.

3

각 요청은 하나 개의 응답을 가질 수

다음은 코드입니다. 파일을 압축하여 하나의 패키지로 다시 보내는 것이 좋습니다.

1

루프 내부에서 Response.End()를 호출하기 때문에 나는 추측 할 수 있습니다. 첫 번째 반복 후에 클라이언트로 되돌아가는 것을 막습니다.

왜 파일을 하나의 다운로드 파일로 압축하지 않으시겠습니까? 이 간단한 것을 만드는 좋은 오픈 소스 C# 압축 라이브러리가 있습니다.

+0

그래, 전에 Response.end()를 가져 왔고 여전히 작동하지 않았다. 압축을 제안 해 주셔서 감사하지만 그것이 내가이 프로젝트를 찾고있는 것은 아닙니다. – Scriptworks

+1

@Scriptworks - 당신이 찾고있는 것이 아니 겠지만, HTTP 프로토콜을 사용하여 원하는 것은 불가능합니다. 요청 당 정확히 한 세트의 헤더 만 있으면 정확히 1 개의 응답을 요구합니다. 즉, 한 요청에 대해 여러 파일을 되돌릴 수 없습니다. @ TheNextman의 제안은 합리적입니다. 대안은 브라우저에서 여러 요청을하는 것입니다. AJAX를 통해. – stephbu

-1

이렇게하는 대신 한 가지 작업을 수행 할 수 있습니다. 이 같은 수집 또는 데이터 테이블, 어떤 것을 모든 경로를 추출 : 한 번에 연결을 열고 모음에있는 모든 경로를로드

FileInfo fInfo; 
      SQLConnection = new SqlConnection(SQLConnectionString); 

      SQLCom = new SqlCommand("spSelect_T", SQLConnection); 
      SQLCom.CommandType = CommandType.StoredProcedure; 
      SQLCom.Parameters.Add(new SqlParameter("@id", CartProduct.ProductId)); 
      SQLConnection.Open(); 
      SQLDReader = SQLCom.ExecuteReader(); 
      DataTable dt = new DataTable(); 
      dt.Load(readerObj); 
      SQLConnection.Close(); 
      readerobj.dispose(); 
      foreach (Datarow row in dt.rows) 
      { 

        fInfo = new FileInfo(Server.MapPath(rows["t_path"].ToString())); 
        Response.Clear(); 
        Response.Expires = -1; 
        Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fInfo.Name + "\""); 
        Response.AddHeader("Content-Length", fInfo.Length.ToString()); 
        Response.ContentType = "application/octet-stream"; 
        Response.WriteFile(fInfo.FullName); 
        Response.End(); 


      } 

시도합니다. 컬렉션을 반복하고 끝에 Response.End()를 사용하십시오. Response.End()는 예외를 throw하므로주의해서 처리하십시오.

+0

여전히 작동하지 않습니다 - HTTP 요청은 단일 응답 스트림을 필요로합니다. 클라이언트가 파일 하나당 하나씩 여러 요청을해야하거나 서버가 파일을 묶어야합니다. 압축을 풀고 고객에게 보내십시오. – stephbu

관련 문제