ファイルをチャンクでダウンロードする

私は以下のような問題があります: ストリームファイルを読み取ることができるSOAP Webサービスがあります。私はチャンクに分割されたファイル全体を読んで、ユーザーに送信する必要があります。すべてのアクションは、UIメインスレッドをブロックしないでください。ユーザーは、保存ファイルダイアログで「保存」ボタンを押し、次のページに移動したり、別のアクションを実行することができます。私はサンプルソリューションに感謝します。ソリューションはIIS 5.1で動作する必要があります。

よろしく、 ジミー

1
覚えておいてください:人々はあなたのためにあなたの仕事をするつもりはありませんが、彼らは喜んで助けてくれるでしょう。したがって、あなたが考えていた解決策、実装しようとしたこと、そしてそれがうまくいかなかった理由を記述すると、役に立つ回答を得る可能性が非常に高くなります。
追加された 著者 Rune,
100KBの制作元ファイルは要求しません。解決している作業を示すスニペットが必要です。それともあなたにとっても違法だと思いますか?あなたの法的義務は、Stack Overflowに関する質問を投稿することを許可していますか? :)
追加された 著者 Zruty,
誰かが私のためにそれを書いてくれるとは思わない。残念ながら、法的な理由から既存のソリューションを表示することはできません。任意のヒントや擬似コードは非常に役立ちます。
追加された 著者 grom,

3 答え

ASP.NETでファイルを1バイトずつダウンロードページにダウンロードする。これについては、 msdn をご覧ください。

try
   {
      System.String filename = "C:\\downloadJSP\\myFile.txt";

     //set the http content type to "APPLICATION/OCTET-STREAM
      Response.ContentType = "APPLICATION/OCTET-STREAM";

     //initialize the http content-disposition header to 
     //indicate a file attachment with the default filename
     //"myFile.txt"
      System.String disHeader = "Attachment;
      Filename=\"myFile.txt\"";
      Response.AppendHeader("Content-Disposition", disHeader);

     //transfer the file byte-by-byte to the response object
      System.IO.FileInfo fileToDownload = new
         System.IO.FileInfo(filename);
      System.IO.FileStream fileInputStream = new
        System.IO.FileStream(fileToDownload.FullName,
        System.IO.FileMode.Open, System.IO.FileAccess.Read);
      int i;
      while ((i = fileInputStream.ReadByte()) != - 1)
      {
         Response.Write((char)i);
      }
      fileInputStream.Close();
      Response.Flush();
      Response.Close();
   }
   catch (System.Exception e)
  //file IO errors
   {
      SupportClass.WriteStackTrace(e, Console.Error);
   }

エラーの実装と解決に役立つ記事がいくつかあります。

httpsサーバーのbyte()からExcelファイルをダウンロード

asp.netからファイルをダウンロードするftpファイルをバイトとして取得し、ファイルとして保存する

ASP.NETファイルを使用したリモートファイルのダウンロード

Response.WriteFileは大きなファイルをダウンロードできません

2
追加された

私があなたを正しく理解していれば、ブラウザは現在のページを再読み込みせずにファイルの新しい要求を開始させたいと思っています。最も簡単なアプローチはおそらくtarget = "_ blank"を使ってリンクを作成することです。これは次のようなものです。

Download file

application/octet-stream のコンテンツタイプを指定すると、ほとんどのブラウザはファイルをディスクに保存します。

0
追加された

ProcessRequestメソッドフォームダウンローダHttpHandler:

public void ProcessRequest(HttpContext context)
        {
            RequestTarget target = RequestTarget.ParseFromQueryString(context.Request.QueryString);
            Guid requestId = new Guid(context.Request.QueryString["requestId"]);
            string itemName = HttpUtility.UrlDecode(context.Request.QueryString["itemName"]);
            if (target != null &&
                !requestId.Equals(Guid.Empty) &&
                !string.IsNullOrEmpty(itemName))
            {
                HttpResponse response = context.Response;
                response.Buffer = false;
                response.Clear();
                response.AddHeader("Content-Disposition", "attachment;filename=\"" + itemName + "\"");
                response.ContentType = "application/octet-stream";
                int length = 100000, i = 0;
                byte[] fileBytes;
                do
                {
                    fileBytes = WS.ReadFile(requestId, target, i * length, length);
                    i++;
                    response.OutputStream.Write(fileBytes, 0, fileBytes.Length);
                    response.Flush();
                }
                while (fileBytes != null && fileBytes.Length == length);
            }
        }

全体的な問題は、ダウンロードアクションを整理するのではなく、ダウンロードアクションがUIメインスレッドをブロックしないように条件を満たしていることです。ユーザーは保存ファイルダイアログで「保存」ボタンを押して次のページに移動したり、 。 Niranjan Kalaによって書かれた解決策は、ファイルが非常に大きい場合、ダウンロードアクションが完了するまで別のページを見ることができません。私はそれを感謝しますが、それは私が意味するものではありません...

0
追加された