Reputation: 1645
I have repository class where I want to store the image that is coming from MultipartFile to webapp/resources/images directory before adding the product details to the repository ?
@Override
public void addProduct(Product product) {
Resource resource = resourceLoader.getResource("file:webapp/resources/images");
MultipartFile proudctImage = product.getProudctImage();
try {
proudctImage.transferTo(new File(resource.getFile()+proudctImage.getOriginalFilename()));
} catch (IOException e) {
throw new RuntimeException(e);
}
listOfProducts.add(product);
}
my repository class is ResourceLoaderAware. I am getting fileNotFoundException, "imagesDesert.jpg" is the image I am trying to upload
java.io.FileNotFoundException: webapp\resources\imagesDesert.jpg (The system cannot find the path specified)
Upvotes: 3
Views: 14657
Reputation: 2434
this controller (courtesy: https://askgif.com/) is working fine for me.
source: https://askgif.com/blog/126/how-can-i-upload-image-using-spring-mvc-java/
try this
package net.viralpatel.spring3.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import net.viralpatel.spring3.form.FileUploadForm;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class FileUploadController {
//private String saveDirectory = "D:/Test/Upload/"; //Here I Added
private String saveDirectory = null; //Here I Added
@RequestMapping(value = "/show", method = RequestMethod.GET)
public String displayForm() {
return "file_upload_form";
}
@SuppressWarnings("null")
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(
@ModelAttribute("uploadForm") FileUploadForm uploadForm,
Model map,HttpServletRequest request) throws IllegalStateException, IOException{
List<MultipartFile> files = uploadForm.getFiles();
List<String> fileUrl = new ArrayList<String>();;
String fileName2 = null;
fileName2 = request.getSession().getServletContext().getRealPath("/");
saveDirectory = fileName2+"images\\";
List<String> fileNames = new ArrayList<String>();
//System.out.println("user directory : "+System.getProperty("user.dir"));
System.out.println("applied directory : " + saveDirectory);
if(null != files && files.size() > 0) {
for (MultipartFile multipartFile : files) {
String fileName = multipartFile.getOriginalFilename();
System.out.println("applied directory : " + saveDirectory+fileName);
if(!"".equalsIgnoreCase(fileName)){
//Handle file content - multipartFile.getInputStream()
fileUrl.add(new String(saveDirectory + fileName));
multipartFile.transferTo(new File(saveDirectory + fileName)); //Here I Added
fileNames.add(fileName);
}
//fileNames.add(fileName);
//Handle file content - multipartFile.getInputStream()
//multipartFile.transferTo(new File(saveDirectory + multipartFile.getOriginalFilename())); //Here I Added
}
}
map.addAttribute("files", fileNames);
map.addAttribute("imageurl",fileUrl);
return "file_upload_success";
}
}
Upvotes: 10
Reputation: 1645
Finally I could able to fix this problem, we need not specify the file: prefix, and moreover by default resourceLoader.getResource()
will look for resources in the root directory of our web application, So no need of specifying the webapp
folder name. So finally the following code works for me
@Override
public void addProduct(Product product) {
MultipartFile proudctImage = product.getProudctImage();
if (!proudctImage.isEmpty()) {
try {
proudctImage.transferTo(resourceLoader.getResource("resources/images/"+product.getProductId()+".png").getFile());
} catch (Exception e) {
throw new RuntimeException("Product Image saving failed", e);
}
}
listOfProducts.add(product);
}
Upvotes: 4