2011-01-13 5 views
0

데이터 묶음을 허용하는 텍스트 영역이 있습니다. 그런 다음 $ .ajax를 통해 PHP 스크립트를 처리하여 KML을 생성합니다.JQuery를 통해 파일을 다운로드하도록 강요하십시오.

var pData = $("textarea#data").serialize(); 
$.ajax(
{ 
    type: "POST", 
    url: "tools.php?mode=process", 
    data: pData, 
    success: function(data) 
    { 
     window.location.href = "tools.php?mode=download&"+pData; 
    }); 
}); 

점점 더 많은 데이터를 얻기 시작할 때까지 제대로 작동했습니다. 이제 URI가 너무 큰 URI 오류가 발생하여 파일 다운로드를 강제하는 대안을 찾으려고합니다. 나는 $ .post()도 사용하려했지만 강제로 다운로드 할 수는 없다. 코멘트에 토론을 이어

+1

왜 당신은 URL을 통해 다시 스크립트로 모든 데이터를 전송하고있다? 'process'는 어떻게 든 데이터를 저장하지 않습니까? –

+1

정확하게'pData'를 통해 전달하는 것은 무엇이며, POST와 QST를 통해 동일한 데이터를 전달하기 위해 두 가지 별도의 호출을 사용해야하는 이유는 무엇입니까? .. 다운로드가 시작될 때 동일한 호출에서 처리가 수행 될 수있는 것 같습니다. . –

+0

@ 페카 나는 정말로 잘 모르겠다. 내 두뇌가 작동하지 않는다. 그러나 당신은 좋은 지적을 제기하고 이것을 해결하는 방법에 대한 확실한 아이디어를 제공합니다. @Quintin 일련의 데이터를 무작위로 묶은 일련의 문자열입니다. – Nathan

답변

2

, 이에 대한 최적의 워크 플로우 데이터를 Ajax와 POST 통해 mode=process로 전송됩니다

  1. 수 있습니다;
  2. 스크립트 (임의의 이름) 임시 파일에 결과를 저장하고
  3. 스크립트가 임시 파일을 엽니 다
  4. location.href 전화가 mode=download에가는 AJAX 응답 본문에 해당 파일과 임시 파일의 이름의 이름을 반환 그것을 통과하고 삭제
3

내가 파일에 데이터를 저장하고 jQuery를 함께 다운로드에게 그것을 강제로 파일을 생성하고 PHP로 데이터를 저장하는 것으로 가장 좋은 방법 :

 $data = ''; // data passed to a function or via $_POST['data'] 
     $targetFolder = $_SERVER['DOCUMENT_ROOT'] . '/location/of/file/'; 
     $savedFile = $targetFolder . md5($data). '.html'; 
     $handle = fopen($savedFile, 'w') or die('Cannot open file: '.$savedFile); 
     fwrite($handle, $data); 

     if(file_exists($savedFile)) { 
      $fileName = basename($savedFile); 
      $fileSize = filesize($savedFile); 

      // Output headers. 
      header("Cache-Control: private"); 
      header("Content-Type: application/stream"); 
      header("Content-Length: ".$fileSize); 
      header("Content-Disposition: attachment; filename=".$fileName); 

      // Output file. 
      readfile ($savedFile);     
      exit(); 
     } 
     else { 
      die('The provided file path: ' . $savedFile .' is not valid.'); 
     } 

사용 a를 .click 기능에 JQuery와 또는 $ .post

var forceDownload_URL = 'your/download/function/url.php'; 

$('#download').click(function(){ 
    window.open(forceDownload_URL); 
}); 

// Post method untested, but writing on the fly when called as above works well 
// getting your forceDownload php to return the absolute path to your file 
$.post(forceDownload_URL,{postdata:my_data},function(data){ 
    window.open(data); 
}); 
관련 문제