如何拍摄用户图像,存储它们并在以后渲染它们?
How to take user images, store them, and render them later?
我正在尝试构建一个应用程序,该应用程序从 html 表单获取用户图像,使用 java servlet 将所述图像存储在数据库中,然后将图像呈现到带有另一个 html 标签的屏幕。接受图片的HTML形式为:
<form action="../servlets/submitrequest" method="post" enctype="multipart/form-data">
<input type="number" name="cost" placeholder="Cost" required/><br/>
<p id="img">Image of receipt: <input type="file" name="image" required/><br/></p>
<input type="submit" id="submit" name="submit" value="Submit" onClick="success();"/><br/>
</form>
保存文件的 servlet 的相关部分是:
Random r = new Random();
String dir = "C://tmp/reciepts/" + r.nextInt() + ".png";
for(Part part: request.getParts()) {
if(part.getName().equalsIgnoreCase("image"))
part.write(dir);
}
然后 servlet 将 dir
作为图像文件路径保存在数据库 (postgresql) 中。但是,当我尝试拍摄图像 URL 并将其显示在网络浏览器上时 Chrome 会抛出以下错误:
Not allowed to load local resource: file:///C://tmp/images/1154006734.png
根据 is caused because chrome can't read local files because of security reasons. Fair enough. So I started looking for ways to save it to the webcontent folder, so it would be a part of the content of the web application. I followed 示例并将我的 servlet 代码更改为:
String dir = request.getServletContext().getRealPath("/") + File.separator + "reciepts";
File fileSaveDir = new File(dir);
if (!fileSaveDir.exists()) {
fileSaveDir.mkdir();
}
request.getPart("image").write(dir);
即使在这样做之后我仍然收到同样的错误:
Not allowed to load local resource: file:///C:/Users/Colby/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Project_1//reciepts/image.file
所以我的问题是:我应该在哪里存储用户上传的文件,以便 Web 浏览器和应用程序本身都可以访问这些文件?
您必须更改 servlet 的 doGet 以流回二进制数据。
response.setContentType("application/pdf");
try (
ServletOutputStream output = response.getOutputStream();
InputStream input = getServletContext().getResourceAsStream("myLocalFile.pdf");
){
//transfer buffered stream to output stream
byte[] buffer = new byte[2048];
int bytesRead = -1;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
然后在你的 HTML 中而不是让 <img src...>
指向一个 file
让它指向上面的 servlet。
注意
当然,如果您的 Web 应用程序是 运行 来自远程用户的,那么将不知道或无法直接访问您的 服务器的 文件系统。
我正在尝试构建一个应用程序,该应用程序从 html 表单获取用户图像,使用 java servlet 将所述图像存储在数据库中,然后将图像呈现到带有另一个 html 标签的屏幕。接受图片的HTML形式为:
<form action="../servlets/submitrequest" method="post" enctype="multipart/form-data">
<input type="number" name="cost" placeholder="Cost" required/><br/>
<p id="img">Image of receipt: <input type="file" name="image" required/><br/></p>
<input type="submit" id="submit" name="submit" value="Submit" onClick="success();"/><br/>
</form>
保存文件的 servlet 的相关部分是:
Random r = new Random();
String dir = "C://tmp/reciepts/" + r.nextInt() + ".png";
for(Part part: request.getParts()) {
if(part.getName().equalsIgnoreCase("image"))
part.write(dir);
}
然后 servlet 将 dir
作为图像文件路径保存在数据库 (postgresql) 中。但是,当我尝试拍摄图像 URL 并将其显示在网络浏览器上时 Chrome 会抛出以下错误:
Not allowed to load local resource: file:///C://tmp/images/1154006734.png
根据
String dir = request.getServletContext().getRealPath("/") + File.separator + "reciepts";
File fileSaveDir = new File(dir);
if (!fileSaveDir.exists()) {
fileSaveDir.mkdir();
}
request.getPart("image").write(dir);
即使在这样做之后我仍然收到同样的错误:
Not allowed to load local resource: file:///C:/Users/Colby/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Project_1//reciepts/image.file
所以我的问题是:我应该在哪里存储用户上传的文件,以便 Web 浏览器和应用程序本身都可以访问这些文件?
您必须更改 servlet 的 doGet 以流回二进制数据。
response.setContentType("application/pdf");
try (
ServletOutputStream output = response.getOutputStream();
InputStream input = getServletContext().getResourceAsStream("myLocalFile.pdf");
){
//transfer buffered stream to output stream
byte[] buffer = new byte[2048];
int bytesRead = -1;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
然后在你的 HTML 中而不是让 <img src...>
指向一个 file
让它指向上面的 servlet。
注意
当然,如果您的 Web 应用程序是 运行 来自远程用户的,那么将不知道或无法直接访问您的 服务器的 文件系统。