2014-04-28 38 views
7

在一個get響應我有content-disposition: attachment;filename=f.csv,我需要下載頁面上此文件的內容
$.ajax請求我有一個錯誤。 如何使用jQuery ajax(或get)獲取文件內容?
UPD如何獲取附件文件的內容與jQuery

error: function(jqXHR, textStatus, errorThrown) { 
    console.log(jqXHR, textStatus, errorThrown); 
} 

得到

Object { 
    ... 
    readyState 0 
    responseText "" 
    status 0 
    statusText "error" 
}, error, 

UPD 2
我發現了一個jquery.fileDownload插件,但它顯示的瀏覽器與窗口中保存開放對話框,如下所示: save/open dialog
但我需要得到文件內容
我不需要在電腦上下載文件。

UPD 3
全部代碼:

$.ajax({ 
    url: link, 
    crossDomain: true, 
    dataType: "text", 
    success: function(data, textStatus, jqXHR) { 
     alert(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(jqXHR, textStatus, errorThrown); 
    } 
}); 

文件生成其他服務,我不能改變它。
UPD 4
首先I'l的嘗試從另一個域得到json數據是這樣的:

$.ajax({ 
    url: link, 
    async: true, 
    cache: true, 
    dataType: "jsonp", 
    crossDomain: true, 
    type: "GET", 
    jsonp: "finance_charts_json_callback", 
    jsonpCallback: "finance_charts_json_callback", 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(jqXHR, textStatus, errorThrown); 
    }, 
    success: function(data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 

link看起來像http://chartapi.finance.yahoo.com/instrument/1.0/a/chartdata;type=quote;ys=2012;yz=2;ts=1234567890/json?finance_charts_json_callback=finance_charts_json_callback

而且它的響應頭:

HTTP/1.1 200 OK 
Date: Wed, 30 Apr 2014 12:01:08 GMT 
P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO ... GOV" 
Cache-Control: public 
Expires: Thu, 01 May 2014 00:32:18 GMT 
Last-Modified: Wed, 30 Apr 2014 00:32:18 GMT 
Content-Type: text/javascript; charset=utf-8 
Content-Encoding: gzip 
Vary: Accept-Encoding,X-Ssl 
Age: 0 
Via: http/1.1 yts39.global.media.ir2.yahoo.com (...) 
Server: ATS 
Connection: keep-alive 

一切正常。

當我嘗試從另一臺服務器獲取文件有它的響應頭:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Date: Wed, 30 Apr 2014 12:09:01 GMT 
Pragma: no-cache 
Content-Type: text/csv 
Expires: -1 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
content-disposition: attachment;filename=export.csv 
Content-Encoding: gzip 
Vary: Accept-Encoding 
+0

那是什麼錯誤? –

+0

@ t.niese請參閱** UPD **部分 – ostapische

+0

http://stackoverflow.com/questions/4545311/download-a-file-by-jquery-ajax – setec

回答

0

編輯,更新

嘗試

$(function() { 
    $.getJSON("https://query.yahooapis.com/v1/public/yql?q=select" 
       +"* from csv where url='http://finviz.com/export.ashx?'"   
       +"&format=json&diagnostics=true&callback=?" 
     , function (data, textStatus, jqxhr) { 
     $.each(data.query.results.row, function (index, value) { 
      jqxhr.promise() 
      .done(function() { 
        $("<li>", { 
         "text": value.col2 + " " + value.col8 
        }) 
        .css("padding", "8px") 
        .appendTo("ol"); 
      }) 
      .always(function() { 
       if (index === 4999) { 
        console.log(data.query 
          , data.query.diagnostics.warning 
          , data.query.results.row.length 
          , index 
          , $("li").length); 
       }; 
      }); 
     }); 
    }); 
}); 

的jsfiddle http://jsfiddle.net/guest271314/yxfEp/

+0

「您已達到可以在請求中返回的最大項目數」。它可以工作,但並非所有行都顯示,只有前5000個,無論如何,謝謝,這是我認爲的最佳解決方案。 – ostapische

+0

獲取整個文件的一種方法是訪問站點,然後在站點處使用'arraybuffer'響應類型執行'XMLHttpRequest',如註釋中所述;然後利用「File API」讀取響應。然後需要'$ .post()'數據到另一頁。嘗試使用「iframe」,站點爲「src」;恢復跨域問題;雖然也許可以實現。 fwiw,整個文件包含約7,000多個條目。謝謝。 – guest271314

2

這是不可能的,因爲它駐留在不同的域來獲取文件內容,content-disposition數據與JSONP和兼容服務器不支持通過Access-Control-Allow-Origin標頭的CORS(跨源資源共享)。

你的第一個請求工作,因爲該服務器與JSONP響應。但是,您的content-disposition請求正在接收原始數據(在沒有CORS的情況下無法訪問)。

JSONP會請求資源爲<script>,服務器的JavaScript函數調用來響應,傳遞數據作爲參數。所以當你收到腳本時,瀏覽器執行它,你可以訪問函數中的數據。

content-disposition請求的工作原理是讓服務器輸出文件的原始內容,並且沒有像JSONP那樣的JavaScript函數調用,因此儘管瀏覽器接收到數據,但它不會允許您訪問它。

只有兩個可能的解決方案是:

  • 要求服務器管理員啓用CORS。
  • 通過與您的JavaScript相同的域的服務器端腳本代理您的ajax請求,它不會受到相同的跨域限制,因爲它將成爲服務器到服務器的請求。
+0

我發現現代瀏覽器中的[XMLHttpRequest Level 2](http://dev.w3.org/2006/webapi/XMLHttpRequest-2/)具有'responseType'字段,就像'blob'或'arraybuffer' 。也許我可以使用它? – ostapische

+0

不幸的是,出於安全原因,瀏覽器正在停止它。如果允許你訪問內容,這將是一個重大的安全缺陷。 – MrCode

0

只是一個想法。但是你有沒有試圖在服務器端生成不同的內容?比如將這些csv反序列化爲對象(無論您使用何種語言),然後僅將對象精確地返回到json內容中。

+0

還有另一個資源,我不能那樣做...... – ostapische