SORU
17 AĞUSTOS 2010, Salı


Javascript/JSON veri ile posta yoluyla dosya indirmek için bir WordPress kullanmak

Jquery tabanlı tek sayfalık bir Web uygulaması var. AJAX çağrıları ile Dinlendirici bir web hizmeti ile iletişim kurar.

Aşağıdaki ulaşmak için çalışıyorum:

  1. Bir DİNLENME url için JSON veri içeren bir YAZI gönderin.
  2. Eğer isteğin JSON yanıt belirtir, sonra JSON döndürülür.
  3. Eğer istek bir PDF DOC/etc/yanıt belirtir, sonra indirilebilir bir ikili döndürülür.

1 & 2 iş var, ve istemci jquery uygulaması DOM elemanları JSON verileri temel alan oluşturarak web sayfasında döndürülen verileri görüntüler. Ben de 3 numaralı bakış web-servis noktasından, ve eğer doğru JSON parametre, belirli bir ikili dosya oluşturmak dönecektir anlam çalışma var. Ama istemci javascript kodu #3 ile başa çıkmak için en iyi yolu emin değilim.

İndirilebilir bir ajax çağrısından geri bu şekilde dosya almak mümkün müdür? Nasıl tarayıcı indirin ve dosyayı kaydedin gidilir?

$.ajax({
    type: "POST",
    url: "/services/test",
    contentType: "application/json",
    data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
    dataType: "json",
    success: function(json, status){
        if (status != "success") {
            log("Error loading data");
            return;
        }
        log("Data loaded!");
    },
    error: function(result, status, err) {
        log("Error loading data");
        return;
    }
});

Sunucu aşağıdaki başlıkları ile yanıt verir:

Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)

Başka bir fikir, PDF oluşturmak ve bu dosya için bir URL içeren bir sunucu ve dönüş JSON üzerinde saklayın. Sonra, ajax başarı işleyicisi başka bir arama aşağıdaki gibi bir şey yapmak sorun:

success: function(json,status) {
    window.location.href = json.url;
}

Ama bunu yaparken sunucuya birden fazla arama yapmak gerekir anlamına gelir, ve benim sunucu indirilebilir dosyalar oluşturmak, onları bir yere saklamak, periyodik olarak, bu depolama alanı temizleyin.

Bunu yapmanın daha basit bir yolu olmalı. Fikirler?


EDİT: belgeleri gözden geçirdikten Sonra dolar.ajax, gördüğüm tepki veri türü sadece bir xml, html, script, json, jsonp, text, o yüzden sanırım hiçbir şekilde doğrudan bir indirme dosyası kullanarak bir ajax isteği, sürece ben embed ikili dosya kullanarak Veri URI düzeni olarak önerilen @VinayC cevap (olmayan bir şey yapmak istiyorum).

Seçeneklerim sanırım:

  1. Ajax kullanın ve formu göndermek ve form değerleri içine JSON veri gömmek yerine. Muhtemelen gizli iframe ile uğraşmak gerekir.

  2. Ajax kullanmak ve bir standart oluşturmak için bir sorgu dizesi içine JSON verileri dönüştürmek yerine değil istek ve pencere.konum:bu URL href. Mayıs olay kullanmanız gerekir.() preventDefault benim tıklatın işleyicisi uygulamasından URL değiştirme tarayıcı tutmak için.

  3. Benim diğer fikir üzerinde kullanın, ama @naikus cevap önerileri ile geliştirilmiş. AJAX, web hizmeti sağlayan bazı parametre ile talepte bu bir ajax çağrısı ile çağrıldığını biliyorum. Eğer web servis, ajax çağrısından çağrılırsa, sadece oluşturulan kaynak için bir URL ile JSON döndürür. Eğer kaynak doğrudan çağrılırsa, o zaman gerçek bir ikili dosya geri.

Bu konuyu düşündükçe, daha ben son seçenek gibi. Bu şekilde bilgi isteği hakkında geri oluşturmak için zaman, dosya boyutu, hata mesajları, vb.) alabilirim ve indirmeye başlamadan önce bu bilgiler üzerinde işlem yapabilirim. Olumsuz sunucuda ekstra dosya yönetimi.

Bunu yapmanın başka yolu var mı? Herhangi bir artıları dikkat etmem gereken bu yöntemler için eksileri/?

CEVAP
6 Aralık 2011, Salı


letronje'nin çözüm çok basit sayfalar için çalışır. document.body.innerHTML = vücudun HTML metni alır, iframe HTML ekler ve bu dize için sayfanın innerHTML ayarlar. Bu herhangi bir olay sayfanızı, diğer şeyler arasında olan bağları ortadan kaldıracak. Bir öğe oluşturmak ve appendChild kullanın.

$.post('/create_binary_file.php', postData, function(retData) {
  var iframe = document.createElement("iframe");
  iframe.setAttribute("src", retData.url);
  iframe.setAttribute("style", "display: none");
  document.body.appendChild(iframe);
}); 

Ya kullanarak bir WordPress kullanmak

$.post('/create_binary_file.php', postData, function(retData) {
  $("body").append("<iframe src='"   retData.url  "' style='display: none;' ></iframe>");
}); 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • manadude21

    manadude21

    11 Mart 2008