Saya telah melihat beberapa saran seperti menjadikan direktori gambar sebagai tautan simbolis yang menunjuk ke direktori di luar wadah web, tetapi apakah pendekatan ini akan berfungsi baik di lingkungan Windows dan * nix?
Jika Anda mematuhi aturan jalur sistem file * nix (yaitu Anda menggunakan garis miring maju seperti pada /path/to/files
), maka itu akan bekerja pada Windows juga tanpa perlu bermain-main dengan File.separator
rangkaian-string yang jelek . Namun itu hanya akan dipindai pada disk kerja yang sama seperti dari tempat perintah ini dipanggil. Jadi jika Tomcat misalnya diinstal pada C:
maka /path/to/files
akan benar-benar menunjuk ke C:\path\to\files
.
Jika semua file berada di luar webapp, dan Anda ingin memiliki Tomcat DefaultServlet
untuk menanganinya, maka yang perlu Anda lakukan di Tomcat adalah menambahkan elemen Konteks berikut ke /conf/server.xml
dalam <Host>
tag:
<Context docBase="/path/to/files" path="/files" />
Dengan cara ini mereka akan dapat diakses http://example.com/files/...
. Contoh konfigurasi GlassFish / Payara dapat ditemukan di sini dan contoh konfigurasi WildFly dapat ditemukan di sini .
Jika Anda ingin memiliki kontrol atas membaca / menulis file Anda sendiri, maka Anda perlu membuat Servlet
untuk ini yang pada dasarnya hanya mendapat InputStream
file di rasa misalnya FileInputStream
dan menulis ke OutputStream
dari HttpServletResponse
.
Pada tanggapannya, Anda harus mengatur Content-Type
tajuk sehingga klien tahu aplikasi mana yang harus dikaitkan dengan file yang disediakan. Dan, Anda harus mengatur Content-Length
tajuk agar klien dapat menghitung progres unduhan, jika tidak maka tidak akan diketahui. Dan, Anda harus mengatur Content-Disposition
tajuk ke attachment
jika Anda ingin dialog Simpan Sebagai , jika tidak klien akan berusaha untuk menampilkannya sebaris. Terakhir, cukup tulis konten file ke aliran output respons.
Berikut adalah contoh dasar dari servlet tersebut:
@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());
}
}
Ketika dipetakan pada suatu url-pattern
contoh /files/*
, maka Anda dapat memanggilnya dengan http://example.com/files/image.png
. Dengan cara ini Anda dapat memiliki kontrol lebih besar atas permintaan daripada yang DefaultServlet
dilakukan, seperti memberikan gambar default (yaitu if (!file.exists()) file = new File("/path/to/files", "404.gif")
atau lebih). Juga menggunakan request.getPathInfo()
lebih disukai di atas request.getParameter()
karena lebih SEO friendly dan jika tidak IE tidak akan memilih nama file yang benar selama Save As .
Anda dapat menggunakan kembali logika yang sama untuk menyajikan file dari database. Cukup ganti new FileInputStream()
dengan ResultSet#getInputStream()
.
Semoga ini membantu.
Lihat juga:
<Context docBase="/path/to/images" path="/images" />
di Windows, tetapi mendapatkan jalur relatif ke folder webapps:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
ketika melakukanhttp://localhost:8080/images/
:, TAPI file tertentu dari bawahtmp
berfungsi:http://localhost:8080/images/Tulips.jpg
OKAnda dapat melakukannya dengan meletakkan gambar Anda pada jalur yang tetap (misalnya: / var / images, atau c: \ images), menambahkan pengaturan dalam pengaturan aplikasi Anda (diwakili dalam contoh saya oleh Settings.class), dan memuatnya seperti itu, di salah
HttpServlet
satu milik Anda:Atau jika Anda ingin memanipulasi gambar:
maka kode html akan menjadi
<img src="imageServlet?imageName=myimage.png" />
Tentu saja Anda harus mempertimbangkan untuk menyajikan berbagai jenis konten - "image / jpeg", misalnya berdasarkan ekstensi file. Anda juga harus memberikan caching.
Selain itu, Anda dapat menggunakan servlet ini untuk mengubah kualitas gambar Anda, dengan memberikan parameter lebar dan tinggi sebagai argumen, dan menggunakan
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
), tentu saja mempertimbangkan kinerja.sumber
Tambahkan ke server.xml:
Aktifkan parameter daftar file dir di web.xml:
sumber
Persyaratan: Mengakses Sumber Daya statis (gambar / video., Dll.) Dari luar direktori WEBROOT atau dari disk lokal
Langkah 1:
Buat folder di bawah webapps dari tomcat server., Katakanlah nama foldernya adalah myproj
Langkah 2:
Di bawah myproj buat folder WEB-INF di bawah ini buat web.xml sederhana
kode di bawah web.xml
Struktur Direktori untuk dua langkah di atas
Langkah 3:
Sekarang buat file xml dengan nama myproj.xml di bawah lokasi berikut
KODE di myproj.xml:
Langkah 4:
4 A) Sekarang buat folder dengan nama myproj di drive E hard disk Anda dan buat yang baru
folder dengan nama gambar dan letakkan beberapa gambar di folder gambar
(e:myproj\images\)
Mari kita anggap myfoto.jpg ditempatkan di bawah
e:\myproj\images\myfoto.jpg
4 B) Sekarang buat folder dengan nama WEB-INF
e:\myproj\WEB-INF
dan buat web.xml dalam folder WEB-INFKode di web.xml
Langkah 5:
Sekarang buat dokumen .html dengan nama index.html dan letakkan di bawah e: \ myproj
CODE di bawah index.html Selamat datang di Myproj
Struktur Direktori untuk Langkah 4 dan 5 di atas adalah sebagai berikut
Langkah 6:
Sekarang mulai server apache tomcat
Langkah 7:
buka browser dan ketik url sebagai berikut
lalu u tampilkan konten yang disediakan di index.html
Langkah 8:
Untuk Mengakses Gambar di bawah hard disk lokal Anda (di luar webroot)
sumber
Ini adalah cerita dari tempat kerja saya:
- Kami mencoba mengunggah banyak gambar dan dokumen dokumen menggunakan Struts 1 dan Tomcat 7.x.
- Kami mencoba menulis file yang diunggah ke sistem file, nama file, dan jalur lengkap ke catatan basis data.
- Kami mencoba memisahkan folder file di luar direktori aplikasi web . (*)
Solusi di bawah ini cukup sederhana, efektif untuk kebutuhan (*):
Dalam file
META-INF/context.xml
file dengan konten berikut: (Contoh, aplikasi saya berjalan padahttp://localhost:8080/ABC
, nama aplikasi / proyek sayaABC
). (ini juga isi penuh filecontext.xml
)(bekerja dengan Tomcat versi 7 atau lebih baru)
Hasil: Kami telah membuat 2 alias. Misalnya, kami menyimpan gambar di:
D:\images\foo.jpg
dan melihat dari tautan atau menggunakan tag gambar:atau
(Saya menggunakan Netbeans 7.x, Netbeans sepertinya otomatis membuat file
WEB-INF\context.xml
)sumber
Jika Anda memutuskan untuk pengiriman ke
FileServlet
maka Anda juga akan perluallowLinking="true"
dicontext.xml
untuk memungkinkanFileServlet
untuk melintasi symlink.Lihat http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
sumber
jika ada yang tidak dapat menyelesaikan masalahnya dengan jawaban yang diterima, maka perhatikan pertimbangan di bawah ini:
localhost:<port>
dengan<img> src
atribut.context docBase
entri sendiri di dalamserver.xml
file lokalnya .sumber
Baca InputStream file dan tuliskan
ServletOutputStream
untuk mengirim data biner ke klien.Hasil URL langsung ke
src
attibute.sumber
Jika Anda ingin bekerja dengan JAX-RS (mis. RESTEasy) coba ini:
menggunakan
javax.ws.rs.core.Response
dancom.google.common.io.ByteStreams
sumber
Saya melakukannya bahkan lebih sederhana. Masalah: File CSS memiliki tautan url ke folder img. Mendapat 404.
Saya melihat url, http: // tomcatfolder: port / img / blablah.png , yang tidak ada. Tapi, itu benar-benar menunjuk ke aplikasi ROOT di Tomcat.
Jadi saya hanya menyalin folder img dari aplikasi web saya ke aplikasi ROOT itu. Bekerja!
Tidak direkomendasikan untuk produksi, tentu saja, tetapi ini untuk aplikasi dev alat internal.
sumber