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:
- Bir DİNLENME url için JSON veri içeren bir YAZI gönderin.
- Eğer isteğin JSON yanıt belirtir, sonra JSON döndürülür.
- 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:
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.
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.
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
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>");
});
bir öğe veri-öznitelik değeri için bir...
Seçeneğini kullanarak bir WordPress ku...
Vanilya JavaScript vs kullanmak için n...
Python dosya için JSON veri yazma...
Yük Javascript dosyası için bir WordPr...