我正在使用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。我只能用目录创建一个,当我添加文件名时,文件没有上传到目录。
任何人都可以帮助我吗?
感谢。
答案 0 :(得分:0)
您可以使用ServletContext.getRealPath,检查文档link
您需要的只是自动装配ServletContext bean
@Autowired
private ServletContext servletContext;
然后你可以使用servletContext.getRealPath来获取webapps下的目录路径,并在其后面添加新创建文件的名称,所以假设你在webapps下有一个名为images的文件夹
String pathStr= servletContext.getRealPath("/images")+"new name";
然后获取你的多部分对象的旁路
byte[] bytes = fichero.getBytes();
然后使用Files实用程序编写文件
Files.write(Paths.get(pathStr), bytes);
答案 1 :(得分:0)
最后Amed Qarabsa的答案是正确的:
String pathStr= servletContext.getRealPath("/images")+"new name";
但它只适用于制作,我的意思是外部服务器。在eclipse服务器上不起作用。