我正在使用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页面中插入这些图像。我知道我应该保存数据库中的路径,将其与指定用户相关联,但我不知道接下来该做什么。有没有人有什么建议?非常感谢你!
答案 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使其他操作无法执行。