Spring Boot 读取用户上传的 csv 文件

Posted

技术标签:

【中文标题】Spring Boot 读取用户上传的 csv 文件【英文标题】:Spring boot reading a user uploaded csv file 【发布时间】:2020-02-23 10:15:36 【问题描述】:

在我的系统中,我需要上传一个 CSV 文件并将详细信息保存在数据库中。作为第一步,我将上传的文件保存在选定的文件夹中。但是,当我尝试此操作时,我收到以下错误消息。(错误显示在图像中)。有人可以帮我解决这个问题吗?谢谢。

主题控制器

@Controller
public class SubjectController 
    @Autowired
    private SubjectDAO subjectDAO;

    @Autowired
    private CourseDAO courseDAO;

    @Autowired
    private LectureHallDAO lectureHallDAO;

    private final SubjectRepository subjectRepository;



    public SubjectController(SubjectRepository subjectRepository) 
        this.subjectRepository = subjectRepository;
    


    //Save the uploaded file to this folder
    private static String UPLOADED_FOLDER = "F://temp//";

    @GetMapping("/sub")
    public String index() 
        return "addAllSubject";
    

    @PostMapping("/upload") // //new annotation since 4.3
    public String singleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes) 

        if (file.isEmpty()) 
            //redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
            return "redirect:uploadStatus";
        

        try 
            // Get the file and save it somewhere
            byte[] bytes = file.getBytes();
            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
            Files.write(path, bytes);

            //redirectAttributes.addFlashAttribute("message",
            //        "You successfully uploaded '" + file.getOriginalFilename() + "'");

         catch (IOException e) 
            e.printStackTrace();
        

        return "redirect:/uploadStatus";
    

    @GetMapping("/uploadStatus")
    public String uploadStatus() 
        System.out.println("error");
        return "uploadStatus";
    

addAllSubjects html 文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>

<h1>Spring Boot file upload example</h1>

<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" /><br/><br/>
    <input type="submit" value="Submit" />
</form>

</body>
</html>

【问题讨论】:

【参考方案1】:

您不应在没有正当理由和评估这样做的风险的情况下禁用 cors。检查this post。

特别是,鉴于 thymeleaf 会以一种非常简单的方式在您的表单中添加 csrf 令牌;只需将表单的action 属性更改为th:action。这将使用将与您的表单一起提交的令牌创建一个隐藏输入,从而成功发出您的 POST 请求。

这样做与自己添加输入具有相同的效果(但在您的情况下没有理由这样做):

<input type="hidden" th:name="$_csrf.parameterName" th:value="$_csrf.token" />`

编辑:仅作记录,以防有人稍后阅读并需要通过 ajax 发出请求,您可以通过以下方式添加令牌(使用 jquery 进行调用):

var token = '[[$_csrf.token]]';
var header = '[[$_csrf.headerName]]';

$.ajax(
    beforeSend: function(xhr) 
      xhr.setRequestHeader(header, token);
    ,
    ....
)

【讨论】:

非常感谢。它工作得很好,而且还了解 cors 的重要性 @Ayesh17 没问题,godspeed!【参考方案2】:

通过将以下代码添加到 WebSecurityConfig 来解决此问题

@Override
    protected void configure(HttpSecurity http) throws Exception          
        //to upload
        http.cors().and().csrf().disable();
    

【讨论】:

以上是关于Spring Boot 读取用户上传的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 React 和 Spring Boot 上传 CSV 文件

使用存储过程从 sql server 快速读取百万条记录,并使用 java 和 spring boot 将其写入 csv

CSV文件上传解析

在 Spring Boot 中更改上传的 MultipartFile 的编码

Spring Boot参考教程Spring Boot Jar方式读取资源文件

如何使用 Spring Boot 将 CSV 文件导入 MYSQL