Spring MVC将上载的多部分文件保存到特定文件夹
我想将上传的图像保存到部署在Tomcat上的Spring3MVC应用程序中的特定文件夹中 我的问题是,我无法将上载的图像文件保存到运行应用程序的主机 以下是我尝试过的:Spring MVC将上载的多部分文件保存到特定文件夹,spring,file,tomcat,file-upload,Spring,File,Tomcat,File Upload,我想将上传的图像保存到部署在Tomcat上的Spring3MVC应用程序中的特定文件夹中 我的问题是,我无法将上载的图像文件保存到运行应用程序的主机 以下是我尝试过的: private void saveFile(MultipartFile multipartFile, int id) throws Exception { String destination = "/images/" + id + "/" + multipartFile.get
private void saveFile(MultipartFile multipartFile, int id) throws Exception {
String destination = "/images/" + id + "/" + multipartFile.getOriginalFilename();
File file = new File(destination);
multipartFile.transferTo(file);
}
结果:FileNotFoundException-是的,当然,我确实要创建此文件
我使用context.getRealPath
或getResources(“目的地”)
尝试了它,但没有成功
如何在应用程序的特定文件夹中创建包含多部分文件内容的新文件?此代码肯定会对您有所帮助
String filePath = request.getServletContext().getRealPath("/");
multipartFile.transferTo(new File(filePath));
让我们在webapp中创建上传目录,并将文件保存在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);
代码String realPathtoUploads=request.getServletContext().getRealPath(uploadsDir)代码>
如果我从Idea IDE运行应用程序,则返回下一条路径
C:\Users\Iuliia\IdeaProjects\enumberbersbackend\src\main\webapp\uploads\
如果我创建.war并在Tomcat下运行它,那么下一条路径是:
D:\Programs\u Files\apache-tomcat-8.0.27\webapps\enumbservice-0.2.0\uploads\
我的项目结构:
我看到了一个使用xml配置的Spring3示例(注意,这不适用于Spring4.2。*):
`
C:/test111
这是如何在Spring中获得应用程序的真实路径(无需使用响应、会话…)以下内容在ubuntu上对我有效:
String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
您可以从multipartfile获取inputSream,并将其复制到所需的任何目录
public String write(MultipartFile file, String fileType) throws IOException {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss-"));
String fileName = date + file.getOriginalFilename();
// folderPath here is /sismed/temp/exames
String folderPath = SismedConstants.TEMP_DIR + fileType;
String filePath = folderPath + File.separator + fileName;
// Copies Spring's multipartfile inputStream to /sismed/temp/exames (absolute path)
Files.copy(file.getInputStream(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
return filePath;
}
这适用于Linux和Windows。当您尝试context.getRealPath或getResources(“目的地”)时,您会遇到什么错误?请参阅啊,好的,谢谢,getRealPath不起作用,因为如果应用程序部署到war文件中而未解压缩,它将返回null!它在战争容器外工作!但是,在战争中,有没有办法获取文件的路径呢?我不会这么说。将文件添加到已部署的战争中是没有意义的。这就是你想要做的吗?不,不是真的,但我读到一些Web服务器不提取war文件,因此我认为要使上述示例成为可能,必须有一种方法在war目录中写入。因此getRealPath不是正确的方法,因为它将返回null。幸运的是,它正在我的tomcat上工作,但为了加强我的视野,我想知道是否有其他解决方案FileNotFoundException意味着您没有文件夹/images/{id}/,您应该首先创建文件夹。但是如果不使用http servlet请求,我们如何获取路径呢?有很多方法:您可以使用请求或会话来获取实际路径。谢谢你,拉维。m代码的最后一行'file.transferTo(dest);'给我IO异常,错误消息是“系统找不到指定的路径”。知道为什么会发生这种情况吗?@并且,您确定文件系统中存在该路径吗?您需要先创建目录(手动或编程),这非常有用。虽然它实际上与拉维的答案相同,但这是一个更彻底的答案。这个答案在Spring Boot 1.5.10中仍然有效,您不应该使用getRealPath()
来保存文件。。看看好例子。刚刚用File.separator替换了“/”
public String write(MultipartFile file, String fileType) throws IOException {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss-"));
String fileName = date + file.getOriginalFilename();
// folderPath here is /sismed/temp/exames
String folderPath = SismedConstants.TEMP_DIR + fileType;
String filePath = folderPath + File.separator + fileName;
// Copies Spring's multipartfile inputStream to /sismed/temp/exames (absolute path)
Files.copy(file.getInputStream(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
return filePath;
}