使用 Spring Boot 显示从 MySQL 到 Thymeleaf 的文件(pdf、doc、ppt)

Display files (pdf, doc, ppt) from MySQL to Thymeleaf with Spring Boot

我正在尝试在页面上显示一些文档。 我已将它们保存在数据库中,但我不确定如何继续在网站上显示它们并使它们可供下载。 这些文件的格式为(pdf、doc、ppt)。如果有人能提出建议,我将不胜感激。

这是文件实体:

@Entity
@Table(name = "chapter_files")
public class File {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "file_id")
    private Long id;
    
    @Column(name = "file_name")
    private String fileName;
    
    @Column(name = "file")
    @Lob
    private byte[] file;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="chapter_id")
    private Chapter chapter;
}

这是 MySQL table 创建查询:

CREATE TABLE `chapter_files` (
    `file_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `file_name` VARCHAR(50) NOT NULL,
    `file` LONGTEXT NOT NULL,
    `chapter_id` BIGINT(20) NOT NULL,
    PRIMARY KEY (`file_id`),
    INDEX `FKChapter` (`chapter_id`),
    CONSTRAINT `FKChapter` FOREIGN KEY (`chapter_id`) REFERENCES `chapters` (`chapter_id`)
)

这是在数据库中保存文件的服务class方法:

public File saveFiles(MultipartFile file, Chapter chapter) {
        File doc = new File();
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        doc.setFileName(fileName);
        try {
            doc.setFile(file.getBytes());
            doc.setChapter(chapter);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileRepository.save(doc);
    }

我不确定应该如何在页面上显示文件并使它们可供下载。如果您有任何建议或任何我可以阅读的文章,我很乐意关注。

这应该适用于您的常规 Spring MVC 应用程序:

步骤是:

  • 将 HttpServletResponse 注入到您的控制器方法中
  • 从数据库读取文件数据
  • 设置内容类型和header
  • 将字节数组写入输出流
    import org.springframework.stereotype.Controller;
    import org.springframework.util.MimeTypeUtils;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStream;
    
    @Controller
    @RequestMapping("/download")
    public class DownloadController {
    
        @GetMapping("/file/{id}")
        public void downloadFile(@PathVariable Long fileId, HttpServletResponse resp) throws IOException {
    
            File dbFile = fileRepository.readFile(fileId);
    
            byte[] byteArray =  dbFile.getFile(); // read the byteArray
    
            resp.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM.getType()); 
            resp.setHeader("Content-Disposition", "attachment; filename=" + dbFile.fileName());
            resp.setContentLength(byteArray.length);
    
            OutputStream os = resp.getOutputStream();
            try {
                os.write(byteArray, 0, byteArray.length);
            } finally {
                os.close();
            }
    
        }
    }

在您的 Thymeleaf 模板中,您可以使用以下内容创建 link 下载文件:

  <a th:href="@{/download/file/{id}(id=${file.id})}">
         <span th:text="${file.fileName}">Download</span>
  </a>

如果你想从磁盘读取文件并下载,你可能需要做类似这样的事情:https://github.com/gtiwari333/spring-boot-web-application-seed/blob/master/main-app/src/main/java/gt/app/web/mvc/DownloadController.java

此外,如果您使用的是 SPA,例如:AngularJS/Angular 等客户端,那么您可能需要遵循稍微不同的方法。示例见此处。

http://ganeshtiwaridotcomdotnp.blogspot.com/2017/01/angularjs-download-file-from-server.html