如何在JSP页面中使用上传的图像(Spring MVC)

时间:2018-02-23 11:07:35

标签: spring image jsp upload

我正在使用Spring MVC实现一个Web应用程序。我正在尝试实现允许上传图像的模块。我正在使用Apache Commons FileUpload,这是处理发布请求的控制器:

/**
 * Upload single file using Spring Controller
 */
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String uploadFileHandler(@RequestParam("name") String name,
                         @RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        String fileContentType = file.getContentType();
        if (contentTypes.contains(fileContentType)) {
            // You have the correct extension
            // rest of your code here
            try {
                byte[] bytes = file.getBytes();

                // Creating the directory to store file
                String rootPath = System.getProperty("catalina.home");
                File dir = new File(rootPath + File.separator + "bills");
                if (!dir.exists())
                    dir.mkdirs();


                // Create the file on server
                File serverFile = new File(dir.getAbsolutePath()
                        + File.separator + name);
                BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(serverFile));
                stream.write(bytes);
                stream.close();

                System.out.println("Server File Location="
                        + serverFile.getAbsolutePath());

                return "redirect:/";
            } catch (Exception e) {
                //TODO handle error
            }
        } else {
            //TODO handle error
        }
    } else {
        //TODO handle error
    }
}

我的第一个疑问是我应该在哪里保存上传的图片?现在该目录位于GlassFish文件夹中,可以吗?我不知道为什么但上传的图片没有扩展名......是一个没有任何扩展名的简单文件!

现在我想让用户访问这些图像,但我不知道如何在JSP页面中插入这些图像。我知道我应该保存数据库中的路径,将其与指定用户相关联,但我不知道接下来该做什么。有没有人有什么建议?非常感谢你!

2 个答案:

答案 0 :(得分:0)

关于如何使用上传图片的方式,我发现这个解决方案似乎有效,但我不知道它是否是最好的解决方案。在jsp文件中我有这个:

<spring:url value="/file/download/" var="url"/>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <img src="${url}${imageName}"/>
</body>
</html>

其中 imageName 是模型中的一个值,如名称所示,包含文件的名称, url 包含返回的服务的路径图像流。此HTTP请求由以下控制器处理:

    public @ResponseBody byte[] getImageWithMediaType(@PathVariable("name") String name) throws IOException {
        String rootPath = System.getProperty("catalina.home")
        String partialPath = File.separator + "bills" + File.separator + name + ".png"    
        FileInputStream file = new FileInputStream(rootPath + partialPath);
        InputStream is = new BufferedInputStream(file);
        return IOUtils.toByteArray(is);
    }

你认为这是最好的方法吗?

答案 1 :(得分:0)

为什么不使用Spring Content?然后,您根本不需要实现任何控制器代码。假设您正在使用Spring Boot(如果您不是,请告诉我),那么它看起来像这样:

  

的pom.xml

<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>spring-content-rest-boot-starter</artifactId>
    <version>0.0.10</version>
</dependency>
<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>content-fs-spring-boot-starter</artifactId>
    <version>0.0.10</version>
</dependency>
  

SpringBootApplication.java

@SpringBootApplication
public class YourSpringBootApplication {

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

  @Configuration
  @EnableFilesystemStores
  public static class StoreConfig {
    File filesystemRoot() {
        String rootPath = System.getProperty("catalina.home");
        File dir = new File(rootPath + File.separator + "bills");
        if (!dir.exists())
          dir.mkdirs();
    }

    // this bean is the spring resource loader that will be used by
    // the product store  
    @Bean
    public FileSystemResourceLoader fsResourceLoader() throws Exception 
    {
      return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }
  }

  @StoreRestResource(path="upload")
  public interface BillStore extends Store<String> {
    //
  }
}

请注意,您没有在此处编写任何控制器代码,但这足以在/upload创建基于REST的内容服务,该服务实际上支持完整的CRUD功能(以及视频流,以防我们对您有用) )。创建== POST,读取== GET(包括字节范围支持),更新== PUT,删除==删除。

e.g。

POST /upload/my-image.jpg

会将上传的图片存储到System.getProperty("catalina.home") + File.Separator + "bills" + "my-image/jpg"

我假设您希望您的用户最终能够在上传后查看他们的图片,上传新版本并可能删除。鉴于此/upload可能不是一个好名字。但这是你在问题中使用的,所以我在答案中使用了什么。如果您真的只想要上传功能,那么您可以使用Spring Security使其他操作无法执行。