1.问题描述
关键字: SpringMVC 4.2.4 、 Spring Boot 1.3.1 、Servlet 3.0 、文件上传
报错信息: java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/IMG_20160129_132623.jpg (No such file or directory)
问题源码: transferTo方法报错
File fileSourcePath = new File("tmp/source/");
File fileSource = new File(fileSourcePath, mulFileSource.getOriginalFilename());
if (!fileSourcePath.exists()) {
fileSourcePath.mkdirs();
mulFileSource.transferTo(fileSource);
2.问题分析
首先,看源码中文件定义,相对路径,预期路径应该是项目路径/tmp/source/,但是报错确是一个系统临时文件路径(tomcat的)。
其次,由于是transferTo方法报错,因此应该是该方法写入文件时报错,因此,我们跟入方法源码。
```java
public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpServletRequest {
* Spring MultipartFile adapter, wrapping a Servlet 3.0 Part object.
@SuppressWarnings("serial")
private static class StandardMultipartFile implements MultipartFile, Serializable {
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
this.part.write(dest.getPath());
package org.apache.catalina.core;
* Adaptor to allow {@link FileItem} objects generated by the package renamed
* commons-upload to be used by the Servlet 3.0 upload API that expects
* {@link Part}s.
public class ApplicationPart implements Part {
@Override
public void write(String fileName) throws IOException {
File file = new File(fileName);
if (!file.isAbsolute()) {
file = new File(location, fileName);
try {
fileItem.write(file);
} catch (Exception e) {
throw new IOException(e);
源码一目了然,使用Servlet3.0的支持的上传文件功能时,如果我们没有使用绝对路径的话,transferTo方法会在相对路径前添加一个location路径,即:file = new File(location, fileName);。当然,这也影响了SpringMVC的Multipartfile的使用。
由于我们创建的File在项目路径/tmp/source/,而transferTo方法预期写入的文件路径为/tmp/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/,我们并没有创建该目录,因此会抛出异常。
3.问题解决方案
使用绝对路径
修改location的值
这个location可以理解为临时文件目录,我们可以通过配置location的值,使其指向我们的项目路径,这样就解决了我们遇到的问题。
在Spring Boot下配置location,可以在main()方法所在文件中添加如下代码:
* 文件上传临时路径
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/app/pttms/tmp");
return factory.createMultipartConfig();
1.问题描述关键字: SpringMVC 4.2.4 、 Spring Boot 1.3.1 、Servlet 3.0 、文件上传报错信息: java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/I...
项目场景:SpringBoot项目的出现java.io.FileNotFoundException: (系统找不到指定的路径。)
项目场景:Springboot用到文件上传下载功能
问题描述:
问题:java.io.FileNotFoundException: (系统找不到指定的路径。)
具体开发环境下控制台的报错为(windows开发环境):
java.io.FileNotFoundException: D:\ (系统找不到指定的路径。)
at java.io.FileInputStream.ope
@Controller
public class ttryController {
private static final Logger LOGGER = LoggerFactory.getLogger(UploadController.class);
@GetMapping("/tryupload")
publ..
上传文件后
找不到文件位置
在
文件上传成功后
找不到文件所在的位置是Tomcat部署问题,部署在war下在idea工作空间是
找不到上传的文件的
@RequestMapping("/
fileupload2")
public String
fileupload2(HttpServletRequest request,
MultipartFile upload) throws Exception {
System.out.println("springmvc
文件上传。。。。");
例如我的报错信息是
Unable to locate Attribute with the the given name [PNum] on this ManagedType
我的实体字段是这样的p_num,但是在进行findByPNum的报错,原因是实体类声明字段大小写敏感。
经过查看原来:
Jpa查询的规则:
Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。
使用@Component声明 进行自动注入失效
@Component,在默认情况下只能扫描与控制器在同一个包下以及其子包下的@Component注解,以及能将
指定注解的类自动注册为Bean的@Service@Controller和@ Repository,将接口与对应实现类放在了与控制器所在包的同一级目录下,这样的注解自然是无法被识别的。
在Spring Boot中,文件上传可以使用MultipartFile类型来实现。文件上传后,可以将文件保存到指定目录中。以下是一个简单的示例代码,展示了如何将文件上传并保存到指定目录中:
```java
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
String fileName = file.getOriginalFilename();
Path path = Paths.get("C:/uploads/" + fileName);
try {
Files.write(path, file.getBytes());
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.ok("File uploaded successfully");
在这个示例中,文件将保存在C:/uploads/目录下。你可以根据自己的需要修改路径。请注意,为了能够将文件保存到指定目录中,需要确保目录已经存在。如果目录不存在,可以使用Files.createDirectories()创建它。