2014-04-28 16 views
7

Su una risposta get ho content-disposition: attachment;filename=f.csv e ho bisogno di scaricare contenuto di questo file nella pagina.
Su richiesta $.ajax Ho un errore. Come posso ottenere il contenuto del file utilizzando jQuery ajax (o get)?
UPDCome ottenere il contenuto del file allegato con jQuery

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

ottenere

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

UPD 2
ho trovato un plugin jquery.fileDownload, ma mostra la finestra del browser con Salva o aperto dialogo, in questo modo: save/open dialog
Ma ho bisogno di ottenere il contenuto del file .
Non è necessario scaricare il file sul computer.

UPD 3
completa Codice:

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

File genera da un altro servizio e non posso cambiarlo.
UPD 4
Prima di tutto I'l cercare di ottenere i dati json da un altro dominio in questo modo:

$.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 sembra 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

Ed è intestazioni di risposta:

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 

Tutto funziona bene.

Quando provo ad ottenere il file da un altro server lì è intestazioni di risposta:

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

E qual è questo errore? –

+0

@ t.niese vedere ** UPD ** sezione – ostapische

+0

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

risposta

0

Modifica, aggiornato

Prova

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

"Hai raggiunto il numero massimo di elementi che possono essere restituiti in una richiesta". Funziona, ma non tutte le righe mostrano, solo i primi 5000, comunque grazie, è la soluzione migliore che penso. – ostapische

+0

Un approccio per recuperare l'intero file potrebbe essere visitare il sito, quindi eseguire 'XMLHttpRequest' sul sito, utilizzando il tipo di risposta' arraybuffer', come menzionato ai commenti; quindi leggi la risposta utilizzando "File API". Avrebbe quindi bisogno di '$ .post()' i dati in un'altra pagina. Approccio provato che utilizza un 'iframe' con sito come' src'; ripristinare i problemi interdominio; anche se forse realizzabile. Per completezza, l'intero file comprende circa 7.000+ voci. Grazie. – guest271314

2

Non è possibile ottenere il contenuto del file perché risiede in un dominio diverso, i dati content-disposition non è compatibile con JSONP e il server non supporta CORS (Cross Origin Resource Sharing) tramite l'intestazione Access-Control-Allow-Origin.

La prima richiesta funziona perché il server risponde con JSONP. Tuttavia la tua richiesta content-disposition sta ricevendo dati grezzi (a cui non è possibile accedere senza CORS).

JSONP funziona richiedendo la risorsa come <script>, il server risponde con una chiamata di funzione JavaScript, passando i dati come argomento. Quindi quando si riceve lo script, il browser lo esegue e si può accedere ai dati nella funzione.

La richiesta content-disposition funziona eseguendo il contenuto in uscita sul contenuto non elaborato del file e non vi è alcuna chiamata di funzione JavaScript come in JSONP, quindi, sebbene il browser riceva i dati, non ti consentirà di accedervi.

Le uniche due soluzioni possibili sono:

  • chiedere all'amministratore del server per abilitare CORS.
  • Proietta la richiesta ajax tramite uno script sul lato server nello stesso dominio del tuo JavaScript, che non sarà soggetto alle stesse restrizioni del dominio incrociato perché sarà una richiesta da server a server.
+0

Ho trovato che [XMLHttpRequest Level 2] (http://dev.w3.org/2006/webapi/XMLHttpRequest-2/) nei browser moderni ha il campo 'responseType', come un' blob' o 'arraybuffer' . Forse posso usarlo? – ostapische

+0

Purtroppo no, il browser lo sta fermando per ragioni di sicurezza. Sarebbe un grave difetto di sicurezza se ti permettesse di accedere al contenuto. – MrCode

0

solo un'idea. Ma hai provato a generare un contenuto diverso sul lato server ?. come la deserializzazione di questi csv in oggetti (in qualunque lingua tu stia usando) e poi restituisci gli oggetti setializzati in contenuto json.

+0

C'è un'altra risorsa, non posso farlo ... – ostapische

Problemi correlati