present - subir archivos con spring mvc
Spring MVC guarda el archivo MultipartFile cargado en una carpeta específica (5)
Quiero guardar imágenes cargadas en una carpeta específica en una aplicación Spring 3 MVC desplegada en Tomcat
Mi problema es que no puedo guardar los archivos de imágenes cargados en el host donde se está ejecutando la aplicación.
Esto es lo que intenté:
private void saveFile(MultipartFile multipartFile, int id) throws Exception {
String destination = "/images/" + id + "/" + multipartFile.getOriginalFilename();
File file = new File(destination);
multipartFile.transferTo(file);
}
Resultado: FileNotFoundException - Sí, claro, ¡sí quiero crear este archivo!?!
Lo intenté usando context.getRealPath
o getResources("destination")
, pero sin éxito.
¿Cómo puedo crear un nuevo archivo en una carpeta específica de mi aplicación con el contenido de mi archivo multiparte?
Este código seguramente te ayudará.
String filePath = request.getServletContext().getRealPath("/");
multipartFile.transferTo(new File(filePath));
Lo siguiente funcionó para mí en ubuntu:
String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
Vi un ejemplo de primavera 3 usando la configuración xml (tenga en cuenta que esto no funciona en la primavera 4.2. *): http://www.devmanuals.com/tutorials/java/spring/spring3/mvc/spring3-mvc-upload-file.html `
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000" />
<property name="uploadTempDir" ref="uploadDirResource" />
</bean>
<bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource">
<constructor-arg>
<value>C:/test111</value>
</constructor-arg>
</bean>
Creemos el directorio de carga en webapp y guardemos archivos en 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);
el código
String realPathtoUploads = request.getServletContext().getRealPath(uploadsDir);
me devuelve la siguiente ruta si ejecuto la aplicación de Idea IDE
C:/Users/Iuliia/IdeaProjects/ENumbersBackend/src/main/webapp/uploads/
y el siguiente camino si hago .war y lo ejecuto bajo Tomcat:
D:/Programs_Files/apache-tomcat-8.0.27/webapps/enumbservice-0.2.0/uploads/
String ApplicationPath =
ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("");
Esta es la forma de obtener la ruta real de la aplicación en primavera (sin utilizar la respuesta, la sesión ...)