添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
强健的烤面包  ·  CORRUPT_MESSAGE when ...·  1 年前    · 
不要命的伏特加  ·  用 Django ...·  1 年前    · 

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方法报错

// 前端传入mulFileSource
// 创建压缩前源文件
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()创建它。