RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1451050
Accepted
Алексей
Алексей
Asked:2022-09-23 16:57:05 +0000 UTC2022-09-23 16:57:05 +0000 UTC 2022-09-23 16:57:05 +0000 UTC

在 Spring Boot 中打开上传到服务器的文件的问题

  • 772

有一个控制器,我在其中@GetMapping处理页面

orders/{id}/upload

实现以下功能的地方。

显示文件列表,其中包含目录中这些文件的链接

src/main/resources/static/layout/{id}/

并实现了一个多部分表单,通过该表单将文件上传到服务器到上面RestControllervia中指示的文件夹@PostMapping。

问题是:
当我将文件上传到服务器时,它会进入文件列表,但是如果我点击链接,我会收到 404 错误,尽管文件在服务器上。

我重新启动服务器并且链接开始工作(链接地址没有改变)。

告诉我可能是什么问题?

@Controller
public class OrderController {
  @GetMapping("/orders/{id}/upload")
  public String upload(@PathVariable(value = "id") long id, Model model) {
    model.addAttribute("order_number", id);
    String directory = "src/main/resources/static/layout/" + id + "/";
    File file = new File(directory);
    if (!file.exists()) {
        file.mkdirs();
    }
    File[] listFiles = file.listFiles();
    model.addAttribute("listfile", listFiles);
    return "upload";
  }
}

.

@Service
public class FileUploadService {
    public void uploadFile(MultipartFile file, long id) throws IOException {
        File uploadFile = new File("/Users/prisukhin/Documents/printing/src/main/resources/static/layout/" + id + "/" + file.getOriginalFilename());
        if(file != null) {
            file.transferTo(uploadFile);
        }
    }
}

.

@RestController
public class FileUploadRestController {

    @Autowired
    FileUploadService fileUploadService;

    @PostMapping("/orders/{id}/upload")
    public RedirectView fileUpload(@PathVariable(value = "id") long id, @RequestParam MultipartFile file_form, Model model) throws IOException {
        fileUploadService.uploadFile(file_form, id);
        return new RedirectView("/orders/{id}/upload");
    }

upload.html 文件的一部分

<table class="table table-hover">    
  <tbody th:each="l : ${listfile}">
    <tr>
      <td>
        <a th:text="${#strings.substringAfter(l, '/layout/'+order_number+'/')}" th:href="@{'../../'}+${#strings.substringAfter(l, '/static/')}" target="_blank"></a>. 
      </td>
     </tr>
  </tbody>
 </table>
 <form th:attr="action=@{'/orders/'} + ${order_number} + @{'/upload'}" method="POST" enctype="multipart/form-data" class="upload-form mx-auto">
   <div class="input-group mb-3">
     <input type="file" class="form-control" name="file_form" />
       <div class="input-group-append">
         <button class="btn btn-secondary" type="submit">Загрузить</button>
       </div>
   </div>
 </form>

白标错误页面

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Sep 23 11:50:06 MSK 2022
There was an unexpected error (type=Not Found, status=404).
No message available 

调试信息

2022-09-23 11:50:02.881 DEBUG 58415 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/orders/45/upload", parameters={multipart}
2022-09-23 11:50:02.947 DEBUG 58415 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.prisukhin.integral.controllers.FileUploadRestController#fileUpload(long, MultipartFile, Model)
2022-09-23 11:50:03.024 DEBUG 58415 --- [nio-8080-exec-1] o.s.web.servlet.view.RedirectView        : View [RedirectView], model {}
2022-09-23 11:50:03.038 DEBUG 58415 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed 302 FOUND
2022-09-23 11:50:03.046 DEBUG 58415 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : GET "/orders/45/upload", parameters={}
2022-09-23 11:50:03.047 DEBUG 58415 --- [nio-8080-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.prisukhin.integral.controllers.OrderController#upload(long, Model)
2022-09-23 11:50:03.065 DEBUG 58415 --- [nio-8080-exec-2] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8]
2022-09-23 11:50:03.668 DEBUG 58415 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : GET "/css/style.css", parameters={}
2022-09-23 11:50:03.672 DEBUG 58415 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : GET "/img/logo-1.png", parameters={}
2022-09-23 11:50:03.675 DEBUG 58415 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]
2022-09-23 11:50:03.675 DEBUG 58415 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]
2022-09-23 11:50:03.691 DEBUG 58415 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed 200 OK
2022-09-23 11:50:03.693 DEBUG 58415 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 200 OK
2022-09-23 11:50:03.728 DEBUG 58415 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Completed 200 OK


2022-09-23 11:50:06.162 DEBUG 58415 --- [nio-8080-exec-5] **o.s.web.servlet.DispatcherServlet        : GET "/layout/45/0000005z.xml", parameters={}
2022-09-23 11:50:06.163 DEBUG 58415 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ResourceHttpRequestHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/], ServletContext [/]]
2022-09-23 11:50:06.164 DEBUG 58415 --- [nio-8080-exec-5] o.s.w.s.r.ResourceHttpRequestHandler     : Resource not found
2022-09-23 11:50:06.165 DEBUG 58415 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Completed 404 NOT_FOUND
2022-09-23 11:50:06.173 DEBUG 58415 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}
2022-09-23 11:50:06.177 DEBUG 58415 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2022-09-23 11:50:06.226 DEBUG 58415 --- [nio-8080-exec-5] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2022-09-23 11:50:06.229 DEBUG 58415 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 404**
java
  • 0 0 个回答
  • 0 Views

0 个回答

  • Voted
  1. Best Answer
    Михаил Ребров
    2022-09-23T18:03:47Z2022-09-23T18:03:47Z

    该文件夹/src/main/resources/不用于上传用户文件。
    源中的此文件夹用于应用程序资源。

    组装完成后,这个文件夹的所有内容都转移到

    • 文件夹target/classes
      以及已编译的类和导入
      的依赖项(如果项目是由 maven 构建的)
    • 或到一个文件夹build/resources
      (如果项目是由 gradle 构建的)
      编译的类被移动到build/classes

    从哪里(target/ build)启动应用程序。

    这就是为什么在重新启动之前您什么都看不到的原因。

    当您发出请求时,/layout/45/0000005z.xml您的请求ResourceHttpRequestHandler不是沿着路径/Users/prisukhin/Documents/printing/src/main/resources/static/layout/45/0000005z.xml(如您所料)而是沿着路径找到它

    • /Users/prisukhin/Documents/printing/target/static/layout/45/0000005z.xml
      (如果项目是由 maven 构建的)
    • /Users/prisukhin/Documents/printing/build/resources/static/layout/45/0000005z.xml
      (如果项目是 gradle 构建的)

    我求你了,不要下载任何东西。

    • 既不在target/classes/
    • 既不在build/resources/

    它们也不适用于加载用户文件。
    这些是用于构建项目的临时文件夹。

    如何进行?

    您需要在源文件夹和项目构建文件夹之外创建一个单独的文件夹。
    如果您希望它在附近,您可以创建如下内容:

    • /Users/prisukhin/Documents/printing/storage/

    并调整静力学的回归就可以了。

    为此,请将以下几行添加到方法中的 MVC 配置文件(配置类实现WebMvcConfigurer)中:addResourceHandlers(ResourceHandlerRegistry registry)

    registry
        .addResourceHandler("/storage/**")
        .addResourceLocations("file:/Users/prisukhin/Documents/printing/storage/")
        ;
    

    然后你需要修复控制器

    @Controller
    public class OrderController {
      @GetMapping("/orders/{id}/upload")
      public String upload(@PathVariable(value = "id") long id, Model model) {
        model.addAttribute("order_number", id);
        String directory = "/Users/prisukhin/Documents/printing/storage/layout/" + id + "/";
        File file = new File(directory);
        if (!file.exists()) {
            file.mkdirs();
        }
        File[] listFiles = file.listFiles();
        model.addAttribute("listfile", listFiles);
        return "upload";
      }
    }
    
    

    服务

    @Service
    public class FileUploadService {
        public void uploadFile(MultipartFile file, long id) throws IOException {
            File uploadFile = new File("/Users/prisukhin/Documents/printing/storage/layout/" + id + "/" + file.getOriginalFilename());
            if(file != null) {
                file.transferTo(uploadFile);
            }
        }
    }
    
    

    并修复链接...

    他们需要参考/storage/layout/45/0000005z.xml


    配置

    最好将此路径放入 application.properties 通过添加如下行:

    app.storage.path=/Users/prisukhin/Documents/printing/storage/
    

    之后,您可以在服务(和任何地方)中实现它,如下所示

    @Value("${app.storage.path}")
    String storagePath;
    

    在役:

    @Service
    public class FileUploadService {
    
        @Value("${app.storage.path}")
        String storagePath;
    
        public void uploadFile(MultipartFile file, long id) throws IOException {
            File uploadFile = new File(storagePath + "layout/" + id + "/" + file.getOriginalFilename());
            if(file != null) {
                file.transferTo(uploadFile);
            }
        }
    }
    

    在控制器中:

    @Controller
    public class OrderController {
    
      @Value("${app.storage.path}")
      String storagePath;
    
      @GetMapping("/orders/{id}/upload")
      public String upload(@PathVariable(value = "id") long id, Model model) {
        model.addAttribute("order_number", id);
        String directory = storagePath + "layout/" + id + "/";
        File file = new File(directory);
        if (!file.exists()) {
            file.mkdirs();
        }
        File[] listFiles = file.listFiles();
        model.addAttribute("listfile", listFiles);
        return "upload";
      }
    }
    

    然后,您可以轻松地移动此应用程序,而不必担心您的应用程序被固定在您的个人计算机上。您始终可以为所需的环境指定所需的路径,它可以在您的计算机和某处的服务器上同时工作/var/www/

    • 1

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5