2016-08-29 8 views
0

WebサーバーでC言語の組み込みデバイスをプログラミングしています。 1つのタスクは、このデバイスからファイルをダウンロードすることです。私は一度にserveralファイルをダウンロードしたいので、POSTリクエストとzipファイルを返すためのファイル名を使用してajax-requestを作成しました(私はこれらのzip-fileを自分のデバイス上に作成します)。すべて正常に動作しますが、ダイアログボックスsave asはzipファイル全体が送信された後に表示されます。ajax - >ダウンロードする前にダイアログとして保存

サーバー側では、デバイスは200 OK - 、Content-Type: application/octet-stream - 、Content-Disposition: attachment; filename="testzip.zip" - ヘッダーを送信しています。

は、クライアント側で私は(stackoverlfow: Handle file download from ajax postからこれを得た)このjavascriptのコードを使用して:

function downloadFiles(filenames) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', /file-save/, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function() { 
     if (this.status === 200) { 
      var filename = "test.zip"; 
      var type = xhr.getResponseHeader('Content-Type'); 

      var blob = new Blob([this.response], { type: type }); 
      var URL = window.URL || window.webkitURL; 
      var downloadUrl = URL.createObjectURL(blob); 

      // use HTML5 a[download] attribute to specify filename 
      var a = document.createElement("a"); 

      a.href = downloadUrl; 
      a.download = filename; 
      document.body.appendChild(a); 
      a.click(); 


      setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup 

     } 
    }; 
    xhr.send(filenames); 
} 

ザ・if文if (this.status === 200)ファイル全体が送信されたときに、到達しました。ファイルのサイズが小さい場合、ユーザーは時間の不足を認識していないため、問題はありません。しかし、ファイルがダウンロードされているにもかかわらず、ユーザーはダウンロードを見ることができない約50MBのファイルです。私の考えでは、理由はa.click()です。なぜなら、クリックメソッドはダウンロードの開始を模倣するからです。

私に解決策やヒントを教えてくれる人はいますか? ところで、jqueryはオプションではありません!任意の助け

おかげ

EDIT:私の目標は、私が保存する場所との対話を取得する大容量のファイル、とのすべてのウェブページ上のようなファイルをダウンロードすることであると私は、ダウンロード-進行状況を確認することができます。

SOLUTION(君ダーブからヒント):

function downloadFiles(filenames) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', /file_save/, true); 

    xhr.onload = function() { 
     if (this.status === 200) { 
      var mydisp = xhr.getResponseHeader('Content-Disposition'); 

      var save_response = xhr.responseText; 
      var var_json_format = JSON.parse(save_response); 

      /* check for errors */ 
      if(var_json_format["error"]) { 
       return; 
      } else { 
       status = _.findWhere(var_json_format["link"], {id : 'status'}).value; 
       download_id = _.findWhere(var_json_format["link"], {id : 'download_id'}).value; 
      } 

      if(status != "active") { 
       return; 
      } 

      var filename = "test.zip"; 
      var downloadUrl = "/file_save/" + download_id; 

      var a = document.createElement("a"); 

      a.href = downloadUrl; 
      a.download = filename; 
      document.body.appendChild(a); 
      a.click(); 
      document.body.removeChild(a); 

      setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup 

     } 
    }; 

    xhr.send(filenames); 
    return; 
} 
+0

リンクした質問に定義されているAjaxを使用できます。 'success:ではなく' ajaxでは 'complete:'を使うことができます。これはajaxリクエストが完了したときに呼び出されます。 –

+0

しかし、これはjquery-solutionですか? – Chris

+0

はい私の知識によればあなたは正しいです –

答えて

0

あなたの最初の要求は、サーバー上のzipファイルを作成し、そこに到達するためのリンクを返す必要があります。クライアントサイトでそのリンクを受け取ったら、単にそれを実行してください。こうすることで、通常のファイルダウンロードと同じように、すべてが必要に応じて実行されます。 すぐにダウンロードが終了し、ファイルをもう一度削除してください。

+0

よろしくお願いします。しかし、大きなファイルを作成するのに十分なストレージがないため、zipファイルを動的に作成する必要があります。たぶん私は回避策を開発することができます。 – Chris

+0

最も簡単な方法は、ajax呼び出しが完了するまでローダーを表示することです。ポイントは、あなたはこれの間にダウンロードのサイズを知ることはありません。 –

関連する問題