我试图在webapp中加载一个文件,FileNotFound当我使用时我得到了一个例外FileInputStream.但是,使用相同的路径,我能够在我这样做时加载文件getResourceAsStream().这两种方法之间有什么区别,为什么一种方法有效而另一方方法无效?
我有一个在Tomcat上运行的Java Web应用程序.我想加载静态图像,这些图像将在Web UI和应用程序生成的PDF文件中显示.此外,还将通过Web UI上传添加和保存新图像.
通过将静态数据存储在Web容器中但从Web容器外部存储和加载它们来解决这个问题并不是一个问题.
我不想在此时使用像Apache这样的单独的Web服务器来提供静态数据.我也不喜欢将图像以二进制形式存储在数据库中.
我已经看到一些建议,比如将图像目录作为指向Web容器外部目录的符号链接,但这种方法是否适用于Windows和*nix环境?
有人建议编写一个过滤器或servlet来处理图像服务,但这些建议非常模糊和高级别,没有指向如何实现这一目标的更详细信息.
我在这里读到,无论如何都不应该将文件保存在服务器中,因为它不是可移植的,事务性的并且需要外部参数.但是,鉴于我需要一个针对tomcat(7)的tmp解决方案,并且我对服务器机器有(相对)控制,我想知道:
保存文件的最佳位置是什么?我应该保存/WEB-INF/uploads(建议不要在这里)或某个地方$CATALINA_BASE(见这里)或......?JavaEE 6教程从用户获取路径(:wtf :).注意:该文件不应以任何方式下载.
我应该建立一个配置参数详见这里?我很欣赏一些代码(我宁愿给它一个相对路径 - 所以它至少是Tomcat可移植的) - Part.write()看起来很有希望 - 但显然需要一个绝对的路径
我对这种方法与数据库/ JCR存储库的缺点的阐述感兴趣
不幸的是 ,@ BalusC 的FileServlet专注于下载文件,而他在上传文件时的答案会跳过保存文件的位置.
容易转换为使用DB或JCR实现(如长耳兔)的解决方案将是优选的.
这里有关于图像的另一个问题(这似乎比我初步预测的更困难)我正在使用JSF 2.0(apache myFaces)开发一个java Web应用程序,我希望这个应用程序能够将图片上传到目的地它将要运行的服务器.我有运行mySQL Db的Windows r2 2008服务器,但我不想将数据存储在数据库中,我宁愿将其存储在服务器中的某个位置,然后将该路径保存为数据库中的字符串.
我被告知这是最好的方法,但我似乎无法找到如何将其保存在服务器上的示例.我在Apache tomcat Server上运行应用程序作为WAR文件.所以我不知道是否必须将文件保存到服务器驱动器上的路径(即C:\ images)或项目本身的特殊文件夹(在java,html文件中),任何帮助都非常感谢.我完全迷失了,并且整天都陷入困境,试图解决这个问题.
我用来将图像上传到java类的代码是这样的(由CodyS提供):
InputStream is = uploadedFile.getInputStream();
byte[] buffer = new byte[(int) uploadedFile.getSize()];
is.read(buffer);
File f = new File("C:\\temp\\" + this.patient.getPk() + ".jpeg");
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(buffer); //This is where I write it to the C Drive
fos.close();
is.close();
Run Code Online (Sandbox Code Playgroud)
而不是把它写到我的C盘我将在服务器上运行它,但我应该在哪里存储图像以便以后检索并显示在xhtml文件中?我希望我能清楚我需要什么,如果我不是,请告诉我,我会尝试以另一种方式解释.
处理一些导入过程,我需要先在服务器上的某个位置上传文件,然后我需要从这个位置选择文件将其导入系统.我只是想知道什么是存储上传文件的最佳位置.我没什么选择
1)可以在tomcat的根目录中创建一个文件夹,然后将上传文件放在那里,稍后可以为导入过程选择文件.
File dir = new File(System.getProperty("catalina.base"), "uploads");
Run Code Online (Sandbox Code Playgroud)
这是一个很好的选择,天气上面的代码将在所有环境中同样有效
2)我可以在我的应用程序下创建一个uploads文件夹,可以访问它进行文件上传,然后使用以下代码进行导入
ServletActionContext.getServletContext().getRealPath("uploads");
Run Code Online (Sandbox Code Playgroud)
你需要提出宝贵的建议,我需要做的唯一工作就是上传文件并运行上传文件的导入过程,一旦导入成功,就可以将文件从这个文件夹中删除到其他类似处理过的文件等.
我无法得到primeFaces的<p:filedownload工作.我成功使用自定义下载bean下载文件.似乎issu与primefaces文件下载ActionListener有关,但我没有看到如何.有人有线索吗?谢谢.
这是我的豆子:
@ManagedBean(name="fileDownloadBean")
@SessionScoped
public class FileDownloadBean implements Serializable {
private StreamedContent file;
public StreamedContent getFile() {
return file;
}
public void setFile(StreamedContent file) {
this.file = file;
}
/** Creates a new instance of FileDownloadBean */
public FileDownloadBean() {
InputStream stream = this.getClass().getResourceAsStream("sessionlog.csv");
file = new DefaultStreamedContent(stream, "application/csv", "sessionlog.csv");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的观看代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:o="http://openfaces.org/"
template="./../template.xhtml">
<ui:define name="title">
#{bundle.Log}
</ui:define>
<ui:define …Run Code Online (Sandbox Code Playgroud) tomcat ×4
java ×3
servlets ×3
download ×1
file-io ×1
file-upload ×1
image ×1
java-ee ×1
java-ee-5 ×1
jsf ×1
jsf-2 ×1
mysql ×1
primefaces ×1
servlet-3.0 ×1