使用相对路径上传Java Spring Web应用程序文件

db2dz4w8  于 2023-06-21  发布在  Spring
关注(0)|答案(2)|浏览(144)

我正在使用Java,Spring和Hibernate构建Web应用程序。我想编码一个文件上传,这样用户就可以上传照片,但我不能解决相对路径的问题。这里你可以看到spring控制器的代码:

@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。我只能用目录创建一个,当我添加文件名时,文件不会上传到目录。
谁能帮帮我?
谢谢

qnzebej0

qnzebej01#

你可以使用ServletContext.getRealPath,检查文档link
您所需要的只是自动连接ServletContext bean

@Autowired
private ServletContext servletContext;

然后可以使用servletContext.getRealPath获取webapps下的目录路径,并在其后面附加新创建的文件的名称,因此假设webapps下有一个名为images的文件夹

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

然后获取multipart对象的by流

byte[] bytes = fichero.getBytes();

然后使用文件实用程序写入文件

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

zpjtge222#

最后,Amed Qarabsa的回答是正确的:

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

但它只在生产环境中工作,我的意思是外部服务器。在Eclipse服务器上不工作。

相关问题