因此,我目前正在开发一个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);
}
表格看起来像这样
这是显示此表单的代码
<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开发的新手,所以即使查找了几篇文章和教程,我也不知道如何实现。
谢谢。
答案 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);
}
}
<img src="http://localhost:8080/images${YOUR_PASSED_OBJECT.RELATIVE_IMG_PATH_VARIABLE}">
localhost:PORT/images/YOUR_FILE_NAME.EXTENSION
如果您有任何问题,请随时对此答案发表评论,如有需要,我会进行更新。