如何使用Spring显示本地图像(保存在C盘上)?

时间:2019-07-18 09:38:29

标签: java spring

因此,我目前正在开发一个Spring Web应用程序,该应用程序允许您从表单上载图像(有效扩展名:.png,.jpeg,.jpg和.gif)。然后将映像保存在磁盘上,并将其相对路径存储在数据库中。我已使用以下代码成功将图像保存到磁盘:

@Override
public void saveThumbnail(MultipartFile thumbnailFile) throws Exception {
    String folder = "/bundles/";
    byte[] bytes = thumbnailFile.getBytes();
    Path path = Paths.get(folder + thumbnailFile.getOriginalFilename());
    Files.write(path, bytes);
}

表格看起来像这样

enter image description here

这是显示此表单的代码

                <form:form method="POST" modelAttribute="eventForm" class="form-signin" enctype="multipart/form-data">
                <spring:bind path="name">
                    <span>Name</span><br>
                    <div class="form-group ${status.error ? 'has-error' : ''}">
                        <form:input type="text" path="name" class="form-control" placeholder="Name"
                                    autofocus="true"></form:input>
                        <form:errors path="name"></form:errors>
                    </div>
                </spring:bind>

                <spring:bind path="price">
                    <span>Price</span><br>
                    <div class="form-group ${status.error ? 'has-error' : ''}">
                        <form:input type="number" path="price" class="form-control"></form:input>
                        <form:errors path="price"></form:errors>
                    </div>
                </spring:bind>

                <spring:bind path="thumbnailFile">
                    <span>Thumbnail image</span><br>
                    <div class="form-group ${status.error ? 'has-error' : ''}">
                        <c:if test="${eventForm.thumbnailUrl != null}">
                            <img src="file:C:${eventForm.thumbnailUrl}">
                        </c:if>
                        <form:input type="file" path="thumbnailFile" class="form-control" name="thumbnailFile"/>
                        <form:errors path="thumbnailFile"></form:errors>
                    </div>
                </spring:bind>

                <spring:bind path="description">
                    <span>Description</span><br>
                    <div class="form-group ${status.error ? 'has-error' : ''}">
                        <form:textarea rows="4" path="description" class="form-control" placeholder="Description"/>
                        <form:errors path="description"></form:errors>
                    </div>
                </spring:bind>

                <button type="submit" class="btn-add-new">Save</button>
            </form:form>

我已经尝试过这样显示它:

<img src="file:C:${eventForm.thumbnailUrl}">

但是,我的浏览器似乎阻止了此操作,以防止出现任何安全问题。我进行了一些研究,发现可以让Apache从它可以访问的目录中提供文件。由于我是Web开发的新手,所以即使查找了几篇文章和教程,我也不知道如何实现。

谢谢。

3 个答案:

答案 0 :(得分:1)

您的src不应是服务器中文件的位置,源应该是将为您提供资源的http链接。

您可以配置apache以将URL映射到特定目录中的资源,然后在src属性中提及映射的URL +文件名

或者您可以创建一个控制器,该控制器从特定位置获取资源并将其作为字节流返回,并在src属性中将链接设置为控制器+文件名

答案 1 :(得分:0)

假设您有Apache tomcat服务器。您将必须更新server.xml文件。 添加

<Context  docBase="C:\your\physical\path" path="/path/for/http/url" />

<Host></Host>标记内。这样,您可以访问保存在

中的任何文件
  

“ C:\您的\物理\路径”

从Web应用程序借助URL:

  

http://yourdomain/ 路径/for/http/url/somefile.someextension”

答案 2 :(得分:0)

我终于设法显示了图像。如果其他任何人都想做同样的事情,我想列出我采取的步骤。仅供参考,我正在使用Tomcat和MySQL数据库。

  • 确保系统上存在映像目录并将映像添加到其中。

  • 创建一个名为FileServlet的新类,并将以下代码应用于其中。

@WebServlet("/images/*")
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException
    {
        String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
        File file = new File("C:\\your\\local\\image\\directory", 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());
    }
}
  • 现在转到您的主类并应用名为@ServletComponentScan的注释。您的主类现在应该看起来像这样:
@SpringBootApplication
@ServletComponentScan
public class WebApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApplication.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebApplication.class, args);
    }

}
  • 在您的.jsp文件中,只要您想显示图像的位置,请添加以下行:
<img src="http://localhost:8080/images${YOUR_PASSED_OBJECT.RELATIVE_IMG_PATH_VARIABLE}">
  • 重建您的Web应用程序并转到localhost:PORT/images/YOUR_FILE_NAME.EXTENSION

如果您有任何问题,请随时对此答案发表评论,如有需要,我会进行更新。