Yüklenen görüntü yanıtında belirtilen nedenlerle, yalnızca sayfayı yeniledikten sonra kullanılabilir olan, IDE'nin proje klasörü, yani sunucunun dağıtım klasörü dışında , erişilebilir bir konumda herhangi bir yerde saklayın :
IDE'nin proje klasöründeki değişiklikler, sunucunun çalışma klasörüne hemen yansıtılmaz. IDE'de, sunucunun çalışma klasörünün son güncellemelerle senkronize edilmesini sağlayan bir tür arka plan işi vardır (bu, "yayınlama" olarak adlandırılan IDE terimleridir). Gördüğünüz sorunun ana nedeni budur.
Gerçek dünya kodunda, yüklenen dosyaların web uygulamasının dağıtım klasöründe saklanmasının hiç çalışmayacağı durumlar vardır. Bazı sunucular (varsayılan olarak veya yapılandırmaya göre) dağıtılan WAR dosyasını yerel disk dosya sistemine değil, tam olarak belleğe genişletebilir. Temel olarak konuşlandırılmış WAR dosyasını düzenlemeden ve yeniden dağıtmadan bellekte yeni dosyalar oluşturamazsınız.
Sunucu konuşlandırılmış WAR dosyasını yerel disk dosya sistemine genişlettiğinde bile, yeni oluşturulan tüm dosyalar bir yeniden dağıtımda veya hatta basit bir yeniden başlatmada kaybolur, çünkü bu yeni dosyalar orijinal WAR dosyasının bir parçası değildir.
Benim ya da başka herhangi birinin, sizin yaptığınız sürece, yerel disk dosya sisteminde tam olarak nerede kaydedileceği gerçekten önemli değil değil hiç kullanmak getRealPath()
yöntemini . Bu yöntemi kullanmak herhangi bir durumda endişe vericidir.
Depolama konumuna giden yol, sırayla birçok şekilde tanımlanabilir. Hepsini yapmak zorundasın kendin . Belki de kafa karışıklığınızın nedeni budur çünkü bir şekilde sunucunun tüm bunları otomatik olarak yapmasını beklemiştiniz. Unutmayın ki @MultipartConfig(location)
yok değil nihai yükleme hedefi belirtin, ancak dava dosya boyutu için geçici depolama yeri bellek depolama eşiğini aşıyor.
Bu nedenle, son depolama konumuna giden yol, aşağıdaki yollardan biriyle tanımlanabilir:
kodlanmış:
File uploads = new File("/path/to/uploads");
Aracılığıyla ortam değişkeni SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Sunucu başlatılırken VM argümanı -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
dosya girişi upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
isim upload.location
ve değer ile/path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Varsa, sunucu tarafından sağlanan konumu kullanın, örneğin JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
Her iki durumda da, dosyaya aşağıdaki gibi kolayca başvurabilir ve kaydedebilirsiniz:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Veya kullanıcıların tesadüfen aynı adı taşıyan mevcut dosyaların üzerine yazmasını önlemek için benzersiz bir dosya adını otomatik olarak oluşturmak istediğinizde:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
part
JSP / Servlet'te nasıl edinileceği JSP / Servlet kullanılarak sunucuya nasıl dosya yüklenir? ve nasıl elde edilirpart
JSF cevaplanır <: InputFile h> JSF 2.2 kullanarak dosya yükleme nasıl? Kaydedilen Dosya nerede?
Not: do not kullanmakPart#write()
o tanımlanan geçici depolama konumuna göre yolu yorumlamaktadır olarak @MultipartConfig(location)
.
Ayrıca bakınız: