我有一个 JSP Web 应用程序,我想将用户上传的图像存储在 HDFS 中,然后在图像标签上的 JSP 前端页面中显示图像。我查看了整个互联网,但奇怪的是没有一个用于此特定任务的示例。大多数代码片段要么显示字数统计 Map-Reduce 功能、如何从 FS 写入和打开文件,但不显示如何在网页上显示它。
这是我的应用程序的基本流程。
用户从 web html 表单上传文件
<form action="profile" method="post" enctype="multipart/form-data"> <input type="file" name="photo" value=""/> <input type="submit" value="Upload"/> </form>
Servlet 接收请求并使用 apache FileUpload 1.2.2库将文件写入本地文件系统。这就提出了一个问题,如何在不先保存到本地 FS 的情况下将传入流直接写入 HDFS?
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userPath = request.getServletPath(); if (userPath.equals("/profile")) { if (ServletFileUpload.isMultipartContent(request)) { // create a new file upload handler ServletFileUpload upload = new ServletFileUpload(); // parse the request FileItemIterator iterator = upload.getItemIterator(request); InputStream stream = null; while (iterator.hasNext()) { FileItemStream item = iterator.next(); stream = item.openStream(); if (!item.isFormField()) { File file = new File(request.getServletContext().getRealPath("/") + "images/" + item.getName()); FileOutputStream fos = new FileOutputStream(file); Streams.copy(stream, fos, true); // copy from local FS to HDFS ... } } }
将上传的图像从本地文件系统复制到 HDFS
Configuration config = new Configuration(); config.addResource(new Path("/usr/local/hadoop/etc/hadoop/core-site.xml")); config.addResource(new Path("/usr/local/hadoop/etc/hadoop/hdfs-site.xml")); FileSystem fs = FileSystem.get(config); // For illustration purpose lets call the uploaded file bee.jpg fs.copyFromLocalFile(new Path("file:///home/qualebs/NetBeansProjects/qualebs/build/web/images/bee.jpg"), new Path("bee.jpg")); out.close();
最后的问题 通常是将上传的图像显示到 JSP 页面,只需使用图像标记,如
<img src="images/bee.jpg"/>
当它在 Hadoop 中时如何显示此图像?