42

我想将上传的图像保存到部署在 Tomcat 上的 Spring 3 MVC 应用程序中的特定文件夹中

我的问题是我无法将上传的图像文件保存到运行应用程序的主机。

这是我尝试过的:

private void saveFile(MultipartFile multipartFile, int id) throws Exception {
    String destination = "/images/" + id + "/"  + multipartFile.getOriginalFilename();
    File file = new File(destination);
    multipartFile.transferTo(file);
}

结果:FileNotFoundException - 是的,我确实想创建这个文件!?!

我尝试使用context.getRealPathor getResources("destination"),但没有任何成功。

如何使用我的多部分文件的内容在我的应用程序的特定文件夹中创建一个新文件?

4

6 回答 6

41

这段代码肯定会对你有所帮助。

String filePath = request.getServletContext().getRealPath("/"); 
multipartFile.transferTo(new File(filePath));
于 2013-12-12T13:19:28.190 回答
18

让我们在 webapp 中创建uploads目录并将文件保存在webapp/uploads中:

@RestController
public class GreetingController {

    private final static Logger log = LoggerFactory.getLogger(GreetingController.class);

    @Autowired
    private HttpServletRequest request;


    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
        public
        @ResponseBody
        ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) {
            if (!file.isEmpty()) {
                try {
                    String uploadsDir = "/uploads/";
                    String realPathtoUploads =  request.getServletContext().getRealPath(uploadsDir);
                    if(! new File(realPathtoUploads).exists())
                    {
                        new File(realPathtoUploads).mkdir();
                    }

                    log.info("realPathtoUploads = {}", realPathtoUploads);


                    String orgName = file.getOriginalFilename();
                    String filePath = realPathtoUploads + orgName;
                    File dest = new File(filePath);
                    file.transferTo(dest);

编码
String realPathtoUploads = request.getServletContext().getRealPath(uploadsDir);

如果我从 Idea IDE 运行应用程序,则返回下一条路径
C:\Users\Iuliia\IdeaProjects\ENumbersBackend\src\main\webapp\uploads\

如果我制作 .war 并在 Tomcat 下运行它,则为下一条路径:
D:\Programs_Files\apache-tomcat-8.0.27\webapps\enumbservice-0.2.0\uploads\

我的项目结构:
在此处输入图像描述

于 2015-12-08T17:47:04.840 回答
8

您可以从 multipartfile 获取 inputStream 并将其复制到您想要的任何目录。

public String write(MultipartFile file, String fileType) throws IOException {
    String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss-"));
    String fileName = date + file.getOriginalFilename();
    
    // folderPath here is /sismed/temp/exames
    String folderPath = SismedConstants.TEMP_DIR + fileType;
    String filePath = folderPath + File.separator + fileName;
    
    // Copies Spring's multipartfile inputStream to /sismed/temp/exames (absolute path)
    Files.copy(file.getInputStream(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
    return filePath;
}

这适用于 Linux 和 Windows。

于 2019-02-05T06:37:36.640 回答
1

我看到了一个使用 xml 配置的 spring 3 示例(注意这不适用于 spring 4.2。*): http: //www.devmanuals.com/tutorials/java/spring/spring3/mvc/spring3-mvc-upload-file。 html` _

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000" />
<property name="uploadTempDir" ref="uploadDirResource" />
</bean>

<bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource">
<constructor-arg>
<value>C:/test111</value>
</constructor-arg>
</bean>

于 2016-01-26T23:20:22.150 回答
0
String ApplicationPath = 
        ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("");

这是如何在Spring中获取App的真实路径(不使用响应,会话......)

于 2016-12-13T05:20:54.790 回答
0

以下在 ubuntu 上对我有用:

String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
于 2018-06-07T14:19:06.880 回答