我正在使用spring mvc创建一个简单的Web应用程序。在此应用程序中,我将上传文件的代码编写到了服务器(``目标''文件夹)中。文件可以毫无问题地上传到服务器。现在,我想为上传的文件创建一个URL,可以使用该URL直接访问该文件。我怎样才能做到这一点?
这是将文件上传到服务器的代码。
@PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public boolean saveFile(@RequestPart("file") MultipartFile myFile) {
System.out.println(myFile.getOriginalFilename());
try {
String projectPath = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).getAbsolutePath();
File uploadDir = new File(projectPath + "/uploads");
uploadDir.mkdir();
System.out.println(uploadDir.getAbsolutePath());
myFile.transferTo(new File(uploadDir.getAbsolutePath() + "/" + myFile.getOriginalFilename()));
System.out.println("File Path " + uploadDir.getAbsolutePath() + "/" + myFile.getOriginalFilename());
String imgUrl = "../../../../../BackEnd/target/POS-1.0.0/WEB-INF/classes/uploads/" + myFile.getOriginalFilename();
System.out.println(imgUrl);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
答案 0 :(得分:1)
由于我们不知道您要返回的文件类型,因此可以使用RAW返回:
@GetMapping(value = "/get-file/{filename}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public byte[] getFile(@PathVariable String filename) throws IOException {
File file = new File(
"../../../../../BackEnd/target/POS-1.0.0/WEB-INF/classes/uploads/" + filename);
InputStream inputStream = new FileInputStream(file);
return IOUtils.toByteArray(inputStream);
}
IOUtils.toByteArray(inputStream)
方法来自过度使用的Apache commons IO库:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
答案 1 :(得分:0)
您还可以使用内置服务器功能将URL映射到文件系统。取决于您使用的特定应用程序或Web服务器。
对于Tomcat,请在server.xml中查找此类配置:
<Context docBase="/my/files/folder" path="/get-file" />
根本不需要编码!
答案 2 :(得分:0)
另一种选择是使用Spring Content。与其他解决方案相比,它具有多个优点;它为您提供了控制器和服务的实现,因此您不必自己实现它们。在存储上提供抽象,使您可以重构解决方案而无需更改代码。例如,您可以将解决方案移动到云中,并使用诸如S3之类的东西进行存储。它可以与其他项目Spring Data(用于捕获有关您的内容的其他元数据)和Apache Solr(用于在文档内部进行搜索)配对,总体上将为您提供更丰富的应用程序。
添加到您的应用程序很容易。
pom.xml
<!-- Java API -->
<!-- just change this depdendency if you want to store somewhere else -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>0.6.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.6.0</version>
</dependency>
StoreConfig.java
@Configuration
// just change this annotation if you want to store somewhere else
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/files");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
注意:如果您使用的是Spring Boot,则更加容易。
FileStore.java
@StoreRestResource(path="files")
public interface FileStore extends Store<String> {
}
就是这样。 FileStore本质上是一个通用的Spring ResourceLoader。 spring-content-fs
依赖性将导致Spring Content注入基于文件系统的实现,因此您不必担心自己实现它。此外,如果spring-content-rest
将HTTP请求转发到@Controller
的方法上,则FileStore
的依赖性将导致Spring Content也注入一个实现。
因此,您现在在/files
处可以使用基于REST的全功能(POST,PUT,GET,DELETE)文件服务,该服务将使用您的FileStore
来检索(和存储){{ 1}}在您的服务器上。
所以:
/path/to/your/files
将从GET /files/some/file.csv
下载file.csv
。
然后...
/path/to/your/files/some/
将上传curl --upload-file some-other-file.csv /files/some-other-file.csv
并将其存储在服务器上的some-other-file.csv
中。
HTH