2014-04-28 19 views
7

Na odpowiedź get mam content-disposition: attachment;filename=f.csv i muszę pobrać zawartość tego pliku na stronie.
Na żądanie $.ajax Mam błąd. Jak mogę uzyskać zawartość pliku za pomocą jQuery ajax (lub get)?
UPDJak uzyskać zawartość pliku załącznika z jQuery

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

dostać

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

UPD 2
znalazłem jquery.fileDownload wtyczki, ale to pokazuje okno przeglądarki z lub otwartym oknie zapisać w następujący sposób: save/open dialog
Ale potrzebuję uzyskać treść pliku .
Nie muszę pobierać plików na komputer.

UPD 3
Pełna Listing:

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

pliku generuje przez inną usługę i nie można go zmienić.
UPD 4
Przede wszystkim I'l postarać się json dane z innej domeny tak:

$.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 wygląda 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

I to nagłówki odpowiedzi:

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 

Wszystko działa dobrze.

Kiedy próbuję uzyskać plik z innego serwera nie jest to nagłówki odpowiedzi:

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

A co to za błąd? –

+0

@ t.niese zobaczyć ** ** UPD sekcja – ostapische

+0

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

Odpowiedz

0

Edycja aktualizowane

Spróbuj

$(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

"Osiągnięto maksymalną liczbę przedmiotów, które można zwrócić w żądaniu". Działa, ale nie wszystkie wiersze pokazują, tylko pierwsze 5000, a poza tym, jest to najlepsze rozwiązanie, jakie myślę. – ostapische

+0

Jednym ze sposobów pobrania całego pliku może być odwiedzenie strony, a następnie wykonanie 'XMLHttpRequest' na stronie, z wykorzystaniem typu odpowiedzi' arraybuffer', jak wspomniano w komentarzach; następnie odczytaj odpowiedź za pomocą 'File API'. Następnie musiałby "$ .post()" danych do innej strony. Próbowane podejście z wykorzystaniem 'iframe' z witryną jako' src'; przywrócić problemy z wieloma domenami; choć możliwe do osiągnięcia. fwiw, cały plik zawiera około 7 000 wpisów. Dzięki. – guest271314

2

Nie jest możliwe, aby uzyskać zawartość pliku, ponieważ przebywa w innej domenie, content-disposition danych nie jest kompatybilny z jsonp i serwer nie obsługuje CORS (Cross Origin Resource Sharing) poprzez nagłówek Access-Control-Allow-Origin.

Twoje pierwsze żądanie działa, ponieważ serwer odpowiada za pomocą JSONP. Jednak twoje żądanie content-disposition otrzymuje nieprzetworzone dane (do których nie można uzyskać dostępu bez CORS).

JSONP działa, żądając zasobu jako <script>, serwer odpowiada za pomocą wywołania funkcji JavaScript, przekazując dane jako argument. Kiedy otrzymasz skrypt, przeglądarka go uruchomi i uzyskasz dostęp do danych w funkcji.

Żądanie polega na tym, że sever wypisuje surową zawartość pliku i nie ma wywołania funkcji JavaScript, jak w JSONP, więc chociaż przeglądarka otrzymuje dane, nie pozwala na dostęp do niego.

Jedyne dwa możliwe rozwiązania:

  • Zapytaj administratora serwera, aby umożliwić CORS.
  • Proxy Twój ajax żądanie przez skrypt po stronie serwera w tej samej domenie co JavaScript, które nie będą podlegać takim samym ograniczeniom domenach, ponieważ będzie to serwer na żądanie serwera.
+0

Stwierdziłem, że [XMLHttpRequest Level 2] (http://dev.w3.org/2006/webapi/XMLHttpRequest-2/) w nowoczesnych przeglądarkach ma pole 'responseType', takie jak' blob' lub 'arraybuffer' . Może mogę go użyć? – ostapische

+0

Niestety nie, przeglądarka zatrzymuje się ze względów bezpieczeństwa. Byłaby to poważna luka w zabezpieczeniach, jeśli pozwoliłaby ci na dostęp do treści. – MrCode

0

tylko pomysł. Ale czy próbowałeś wygenerować inną zawartość po stronie serwera ?. jak deserializacja tych csv na obiekty (w jakimkolwiek języku, którego używasz), a następnie po prostu zwracaj obiekty ustawione w zsynchronizowane treści.

+0

Jest inny zasób, nie mogę tego zrobić ... – ostapische

Powiązane problemy