Uygulama dışında statik veri yolu hizmet etmek en basit Java web uygulama sunucusu
Java web uygulaması, Yay ve Amortisörler kullanarak, Tomcat 5.5 üzerinde çalışan var. PDF dosyası uygulama tarafından oluşturulan Web UI ve gösterilecek statik görüntüleri yüklemek istiyorum. Aynı zamanda yeni resimler ve Web arayüzü üzerinden yükleyerek ekledi kaydedilir.
Statik verileri web kap içinde saklı ama saklamak suretiyle bunu yapmak için bir sorun değil ve web kabın dışından yükleme bana baş ağrısı veriyor.
Bu noktada statik veri hizmet için Apache gibi ayrı bir web sunucusu kullanmak için değil tercih ederim. Ben de bir veritabanı içinde ikili görüntüleri saklamak fikrini sevmiyorum.
Görüntü dizin sembolik bağlantı web kabın dışında bir dizine işaret olması gibi bazı öneriler gördüm ama bu yaklaşım, Windows ve *nix ortamlarda hem de çalışır mı?
Bazı filtre veya görüntü ama bu öneriler çok muğlak ve bunu yapmak için nasıl daha ayrıntılı bilgi için işaretçiler olmadan yüksek düzey olmuştur hizmet işlemek için bir sunucu uygulaması yazma öneririz.
CEVAP
Görüntü dizin sembolik bağlantı web kabın dışında bir dizine işaret olması gibi bazı öneriler gördüm *ama bu yaklaşım, Windows üzerinde de çalışacakortamlar nix?
Eğer uygun *nix dosya sistemi yol kuralları (yani kullandığınız sadece eğik olarak /path/to/files
), o zaman iş üzerinde Windows olmadan da ihtiyaç keman ile çirkin File.separator
dize birbirine bağlanması. Ancak sadece bu komut çağırdı yerden aynı çalışma diskte taranmış olurdu. Eğer Tomcat C:
yüklü örneğin, eğer öyleyse /path/to/files
aslında C:\path\to\files
işaret eder.
Eğer dosyaları dışında bulunan tüm web ve belki Tomcat DefaultServlet
tutacağımı siz temelde gerekiyor Tomcat için aşağıdaki ekleme Bağlam öğe /conf/server.xml
içinde <Host>
etiket:
<Context docBase="/path/to/files" path="/files" />
Bu şekilde http://example.com/files/...
üzerinden erişilebilir olacak.
İsterseniz kontrol üzerinde okuma/yazma dosyaları kendinize, sonra ihtiyacınız oluşturmak için Servlet
bu temelde sadece alır InputStream
dosyasında lezzet için örnek FileInputStream
ve yazma için OutputStream
HttpServletResponse
.
Yanıtta, istemci dosya veren bilir ki Content-Type
Başlığı ayarlamak gerekir. Ve, istemci karşıdan yükleme ilerleme hesaplamak, böylece Content-Length
Başlığı ayarlamanız gerekir, aksi takdirde bilinmeyen olacak. Ve, eğer isterseniz attachment
19 *Başlığı ayarlamak gerekirKaydetiletişim, aksi takdirde istemci satır görüntülemek için çalışacaktır. Sadece yanıt çıktı akımına dosya içeriğini yaz sonunda.
İşte böyle bir sunucu temel bir örnek:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimetype(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" file.getName() "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
Örneğin url-pattern
bir haritaya ne zaman /files/*
http://example.com/files/image.png
ile gelebilir. Bu şekilde ** 25, varsayılan bir resim (yani if (!file.exists()) file = new File("/path/to/files", "404.gif")
) sağlama gibi daha istekleri üzerinde daha fazla kontrol sahibi olabilirsiniz. request.getPathInfo()
daha fazla SEO ve aksi halde YANİ dostu çünkü request.getParameter()
yukarıda tercih edildiği de kullanarak doğru dosya adı sırasında almak olmazKaydet.
Veritabanından hizmet veren dosyalar için de aynı mantığı kullanabilirsiniz. Sadece ResultSet#getInputStream()
new FileInputStream()
değiştirin.
Bu yardımcı olur umarım.
Ayrıca Bkz:
- Abstract template for a static resource servlet (destekleyen HTTP önbellek)
- FileServlet supporting resume and caching and GZIP
Meteor dağıtılan bir uygulama veri akt...
Yerel Ağ Uygulama Sunucusu GAE dev eri...
Uygulama nasıl olsun'in yolu s ed...
Tek örnek bir uygulama oluşturmak için...
Uygulama INotifyPropertyChanged - daha...