带相对路径的Java Spring web应用程序文件上载

带相对路径的Java Spring web应用程序文件上载,java,spring,hibernate,maven,path,Java,Spring,Hibernate,Maven,Path,我正在使用Java、Spring和Hibernate构建web应用程序。 我想对文件上传进行编码,以便用户可以上传照片,但我无法解决相关路径的问题。 在这里您可以看到弹簧控制器的代码: @RequestMapping(value = "/upload", method = RequestMethod.POST) public ModelAndView subidaFicheroUnico(@RequestParam("fichero") MultipartFile fichero, @Model

我正在使用Java、Spring和Hibernate构建web应用程序。 我想对文件上传进行编码,以便用户可以上传照片,但我无法解决相关路径的问题。 在这里您可以看到弹簧控制器的代码:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ModelAndView subidaFicheroUnico(@RequestParam("fichero") MultipartFile fichero, @ModelAttribute("maquinaSeleccionada")Maquina oMaquinaSeleccionada) throws IOException {

     File imagenUpload = new ClassPathResource("imagenes/maquinas/fullsize").getFile(); 


     String CARPETA_IMAGENES = imagenUpload.toString();
    ModelAndView mv = new ModelAndView("subidaFicheros");

    if (fichero.isEmpty()) {           
        mv.addObject("mensaje", "Seleccione una imagen");
    }

    try {

        /** Guardar el archivo en disco */
        byte[] bytes = fichero.getBytes();
        Path path = Paths.get(CARPETA_IMAGENES +"/"+ fichero.getOriginalFilename());
        Path path2 = Paths.get(imagenUpload.toURI());
        String routePath = this.getClass().getClassLoader().getResource(File.separator).getPath();

        Files.write(path, bytes);

        /** Guardar el archivo en BD */            
        Imagen oNuevaImagen = new Imagen (  oMaquinaSeleccionada.getIdMaquina(),
                                            fichero.getName());
        servicioImagen.insertaImagen(oNuevaImagen);

        mv.addObject("mensaje", "Ha subido correctamente la imagen '" + fichero.getOriginalFilename() + "'");

        logger.info("Fichero subido:"+path.toString());
        logger.info("Fichero subido:"+path.toFile().toURL().getPath());
        logger.info("Fichero subido:"+path.toUri().getPath());
        logger.info("Fichero subido:"+path.toString());
        logger.info("Fichero subido:"+path.toString());

    } catch (IOException e) {
        e.printStackTrace();
    }        

    return mv;     
}
我找到了一种使用ClassPathResource处理相对路径的方法:

File imagenUpload = new ClassPathResource("imagenes/maquinas/fullsize").getFile(); 
在这里,您可以看到具有映像目录路径的文件的工作示例。 问题是,您无法使用不存在的文件路径创建ClassPathResource。我只能用目录创建一个,当我添加文件名时,文件不会上载到目录

有人能帮我吗


谢谢。

您可以使用ServletContext.getRealPath,请查看文档

您所需要的只是自动连接ServletContext bean

@Autowired
private ServletContext servletContext;
然后,您可以使用servletContext.getRealPath获取webapps下的目录路径,并将新创建的文件名附加到该目录,因此假设您在webapps下有一个名为images的文件夹

String pathStr= servletContext.getRealPath("/images")+"new name";
然后获取多部分对象的by流

byte[] bytes = fichero.getBytes();
然后使用文件实用程序写入文件

Files.write(Paths.get(pathStr), bytes);

您可以使用ServletContext.getRealPath,检查文档

您所需要的只是自动连接ServletContext bean

@Autowired
private ServletContext servletContext;
然后,您可以使用servletContext.getRealPath获取webapps下的目录路径,并将新创建的文件名附加到该目录,因此假设您在webapps下有一个名为images的文件夹

String pathStr= servletContext.getRealPath("/images")+"new name";
然后获取多部分对象的by流

byte[] bytes = fichero.getBytes();
然后使用文件实用程序写入文件

Files.write(Paths.get(pathStr), bytes);

最后,阿迈德·卡拉布萨的回答是正确的:

String pathStr= servletContext.getRealPath("/images")+"new name";

但它只在生产环境下工作,我指的是外部服务器。在eclipse服务器上无法工作

最后,阿米德·卡拉布萨的回答是正确的:

String pathStr= servletContext.getRealPath("/images")+"new name";


但它只在生产环境下工作,我指的是外部服务器。在eclipse服务器上无法工作

有什么问题?你想上传与什么相关的文件?问题是我想将新文件保存在我的项目中的一个目录(resources/imagenes/maquinas/fullsize)中,我不知道为什么,但它没有上传文件。我认为这是一个相对路径的问题。在运行时并没有项目,你们不运行源代码。提示:问题不是相对路径,而是更基本的。我该如何解决这个问题?我的意思是,我该如何上传项目中resources文件夹中的文件?问题是什么?你想上传与什么相关的文件?问题是我想将新文件保存在我的项目中的一个目录(resources/imagenes/maquinas/fullsize)中,我不知道为什么,但它没有上传文件。我认为这是一个相对路径的问题。在运行时并没有项目,你们不运行源代码。提示:问题不是相对路径,而是更基本的。我该如何解决这个问题?我的意思是,我该如何上传项目中resources文件夹中的文件?它仍然不起作用。路径似乎正常,但没有在路径中创建文件。@Pedro您在windows或linux?windows上。结果路径是E:\Eclipse\Workspaces\wks\u LaPoderosa2\.metadata\.plugins\org.Eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\resources\img\maquinas\fullsize\DSCN1072.JPG。此路径是运行应用程序时创建的临时路径,不是吗?实际目录位于…wks_LaPoderosa2\GestionMaquinaria\…请尝试以下字符串pathStr=servletContext.getRealPath(“/images/”)+“new name”;路径似乎无效。错误java.nio.file.NoSuchFileException:E:\Eclipse\Workspaces\wks\u LaPoderosa2\.metadata\.plugins\org.Eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\img\DSCN1072.JPG。唯一有效的路径是我之前发布的路径。它仍然不起作用。路径似乎正常,但没有在路径中创建文件。@Pedro您在windows或linux?windows上。结果路径是E:\Eclipse\Workspaces\wks\u LaPoderosa2\.metadata\.plugins\org.Eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\resources\img\maquinas\fullsize\DSCN1072.JPG。此路径是运行应用程序时创建的临时路径,不是吗?实际目录位于…wks_LaPoderosa2\GestionMaquinaria\…请尝试以下字符串pathStr=servletContext.getRealPath(“/images/”)+“new name”;路径似乎无效。错误java.nio.file.NoSuchFileException:E:\Eclipse\Workspaces\wks\u LaPoderosa2\.metadata\.plugins\org.Eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\img\DSCN1072.JPG。唯一有效的路径是我之前发布的路径。