Jquery tabanlı tek sayfalı bir web uygulamam var. AJAX çağrıları üzerinden RESTful bir web servisi ile iletişim kurar.
Aşağıdakileri gerçekleştirmeye çalışıyorum:
- Bir REST URL'sine JSON verileri içeren bir POST gönderin.
- İstek bir JSON yanıtı belirtirse, JSON döndürülür.
- İstek bir PDF / XLS / vb yanıtı belirtirse, indirilebilir bir ikili dosya döndürülür.
1 & 2 şimdi çalışıyor ve istemci jquery uygulaması JSON verilerine dayalı DOM öğeleri oluşturarak web sayfasında döndürülen verileri görüntüler. Ayrıca web hizmeti açısından # 3 çalışma var, yani doğru JSON parametreleri verilirse bir ikili dosya oluşturur ve döndürür. Ama istemci javascript kodunda # 3 ile başa çıkmak için en iyi yolu emin değilim.
Böyle bir ajax çağrısından indirilebilir bir dosya geri almak mümkün mü? Tarayıcıyı dosyayı indirip nasıl kaydedebilirim?
$.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ıklarla 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'yi oluşturmak ve sunucuda saklamak ve dosyaya bir URL içeren JSON'u döndürmektir. Ardından, ajax başarı işleyicisine aşağıdakine benzer bir şey yapmak için başka bir çağrı yapın:
success: function(json,status) {
window.location.href = json.url;
}
Ancak bunu yapmak, sunucuya birden fazla çağrı yapmam gerektiği ve sunucumun indirilebilir dosyalar oluşturması, bir yerde saklaması ve daha sonra düzenli olarak bu depolama alanını temizlemesi gerektiği anlamına gelir.
Bunu başarmanın daha basit bir yolu olmalı. Fikirler?
EDIT: $ .ajax için belgeleri inceledikten sonra ben yanıt dataType sadece biri olabilir xml, html, script, json, jsonp, text
, bu yüzden kullanarak ikili dosya gömmek sürece ajax isteği kullanarak bir dosyayı doğrudan indirmek için hiçbir yolu olduğunu tahmin ediyorum @VinayC yanıtında önerildiği gibi veri URI şeması (yapmak istediğim bir şey değil).
Sanırım seçeneklerim:
Ajax kullanmayın ve bunun yerine bir form postası gönderin ve JSON verilerimi form değerlerine gömün. Muhtemelen gizli iframe'ler ve benzeri ile uğraşmak gerekir.
Ajax kullanmayın ve bunun yerine standart bir GET isteği oluşturmak ve bu URL'ye window.location.href ayarlamak için JSON verilerimi bir sorgu dizesine dönüştürmek değil. Tarayıcının uygulama URL'sinden değişmesini önlemek için tıklama işleyicimde event.preventDefault () yöntemini kullanmanız gerekebilir.
Yukarıdaki diğer fikrimi kullan, ancak @naikus yanıtından gelen önerilerle geliştirildi. AJAX isteğini, web servisine bunun bir ajax çağrısı yoluyla çağrıldığını bildiren bazı parametrelerle gönderin. Web hizmeti bir ajax çağrısından çağrılırsa, oluşturulan kaynağa URL içeren JSON döndürmeniz yeterlidir. Kaynak doğrudan çağrılırsa, gerçek ikili dosyayı döndürün.
Ne kadar çok düşünürsem, son seçeneği o kadar çok seviyorum. Bu şekilde istek hakkında (bilgi oluşturma zamanı, dosya boyutu, hata mesajları, vb.) Geri bilgi alabilirim ve indirmeye başlamadan önce bu bilgilere göre hareket edebilirim. Dezavantajı sunucu üzerinde ekstra dosya yönetimi.
Bunu başarmanın başka bir yolu var mı? Bu yöntemleri bilmem gereken herhangi bir artı / eksileri?
url = 'http://localhost/file.php?file='+ $('input').val(); window.open(url);
Aynı sonuçları almanın kolay yolu. Başlığı php dosyasına koyun. Herhangi bir ajax göndermeye veya istek almaya gerek yok