Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MVC将上载的多部分文件保存到特定文件夹_Spring_File_Tomcat_File Upload - Fatal编程技术网

Spring MVC将上载的多部分文件保存到特定文件夹

Spring MVC将上载的多部分文件保存到特定文件夹,spring,file,tomcat,file-upload,Spring,File,Tomcat,File Upload,我想将上传的图像保存到部署在Tomcat上的Spring3MVC应用程序中的特定文件夹中 我的问题是,我无法将上载的图像文件保存到运行应用程序的主机 以下是我尝试过的: private void saveFile(MultipartFile multipartFile, int id) throws Exception { String destination = "/images/" + id + "/" + multipartFile.get

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

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

以下是我尝试过的:

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.getRealPath
getResources(“目的地”)
尝试了它,但没有成功


如何在应用程序的特定文件夹中创建包含多部分文件内容的新文件?

此代码肯定会对您有所帮助

String filePath = request.getServletContext().getRealPath("/"); 
multipartFile.transferTo(new File(filePath));

让我们在webapp中创建上传目录,并将文件保存在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\enumberbersbackend\src\main\webapp\uploads\

如果我创建.war并在Tomcat下运行它,那么下一条路径是:
D:\Programs\u Files\apache-tomcat-8.0.27\webapps\enumbservice-0.2.0\uploads\

我的项目结构:

我看到了一个使用xml配置的Spring3示例(注意,这不适用于Spring4.2。*): `


C:/test111

这是如何在Spring中获得应用程序的真实路径(无需使用响应、会话…)

以下内容在ubuntu上对我有效:

String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);

您可以从multipartfile获取inputSream,并将其复制到所需的任何目录

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。

当您尝试context.getRealPath或getResources(“目的地”)时,您会遇到什么错误?请参阅啊,好的,谢谢,getRealPath不起作用,因为如果应用程序部署到war文件中而未解压缩,它将返回null!它在战争容器外工作!但是,在战争中,有没有办法获取文件的路径呢?我不会这么说。将文件添加到已部署的战争中是没有意义的。这就是你想要做的吗?不,不是真的,但我读到一些Web服务器不提取war文件,因此我认为要使上述示例成为可能,必须有一种方法在war目录中写入。因此getRealPath不是正确的方法,因为它将返回null。幸运的是,它正在我的tomcat上工作,但为了加强我的视野,我想知道是否有其他解决方案FileNotFoundException意味着您没有文件夹/images/{id}/,您应该首先创建文件夹。但是如果不使用http servlet请求,我们如何获取路径呢?有很多方法:您可以使用请求或会话来获取实际路径。谢谢你,拉维。m代码的最后一行'file.transferTo(dest);'给我IO异常,错误消息是“系统找不到指定的路径”。知道为什么会发生这种情况吗?@并且,您确定文件系统中存在该路径吗?您需要先创建目录(手动或编程),这非常有用。虽然它实际上与拉维的答案相同,但这是一个更彻底的答案。这个答案在Spring Boot 1.5.10中仍然有效,您不应该使用
getRealPath()
来保存文件。。看看好例子。刚刚用File.separator替换了“/”
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;
}