【问题标题】:Java Spring web app file upload with relative path使用相对路径上传 Java Spring Web 应用程序文件
【发布时间】:2017-08-27 17:31:38
【问题描述】:

我正在使用 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。我只能用目录创建一个,当我添加文件名时,文件不会上传到目录中。

谁能帮帮我?

谢谢。

【问题讨论】:

  • 有什么问题?你想上传文件相对于什么?
  • 问题是我想将新文件保存在我的项目内的一个目录中(resources/imagenes/maquinas/fullsize),我不知道为什么,但它没有上传文件。我认为是相对路径的问题。
  • 运行时没有项目,你不要运行源代码。提示:问题不是相对路径,而是更基本的。
  • 我该如何解决这个问题?我的意思是如何在我的项目内的资源文件夹中上传文件?

标签: java spring hibernate maven path


【解决方案1】:

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

您只需要自动装配 ServletContext bean

@Autowired
private ServletContext servletContext;

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

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

然后获取多部分对象的 by 流

byte[] bytes = fichero.getBytes();

然后使用 Files 工具写入文件

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

【讨论】:

  • 它仍然不起作用。路径似乎没问题,但路径中没有创建文件。
  • @Pedro 你是在 windows 还是 linux 上?
  • 视窗。结果路径为 E:\Eclipse\Workspaces\wks_LaPoderosa2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\resources\img\maquinas\fullsize\DSCN1072.JPG 。这个路径是你运行应用程序时创建的临时路径,不是吗?真正的目录在...wks_LaPoderosa2\GestionMaquinaria\...
  • 试试这个 String pathStr= servletContext.getRealPath("/images/")+"new name";
  • 路径似乎无效。错误 java.nio.file.NoSuchFileException: E:\Eclipse\Workspaces\wks_LaPoderosa2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\GestionMaquinaria\img\DSCN1072.JPG。唯一有效的路径是我之前发布的路径。
【解决方案2】:

最后,Amed Qarabsa 的回答是对的:

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

但它只适用于生产,我的意思是外部服务器。在 Eclipse 服务器上不起作用。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多