SORU
28 Kasım 2009, CUMARTESİ


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
28 Kasım 2009, CUMARTESİ


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:

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • How To Cook That

    How To Cook

    16 NİSAN 2011
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006