Java8 和 Spring Boot 实现文件上传、重命名、转换为图片并保存
以下是一个基本的 Java8 和 Spring Boot 实现,可以将 doc/pdf/ppt 格式的文件上传、根据页数重命名、转换为图片并保存到指定文件夹:
- 创建一个 Spring Boot 项目,并添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-examples</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
- 创建一个文件上传服务:
@Service
public class FileUploadService {
private final String UPLOAD_PATH = 'C:/uploads'; //指定上传文件保存的路径
public String uploadFile(MultipartFile file) throws IOException {
String originalName = file.getOriginalFilename();
String fileType = originalName.substring(originalName.lastIndexOf('.') + 1); //获取文件后缀名
//根据不同的文件类型进行处理
switch (fileType.toLowerCase()) {
case 'doc':
case 'docx':
return uploadWordFile(file);
case 'ppt':
case 'pptx':
return uploadPptFile(file);
case 'pdf':
return uploadPdfFile(file);
default:
throw new RuntimeException('Unsupported file format!');
}
}
private String uploadWordFile(MultipartFile file) throws IOException {
File uploadDir = new File(UPLOAD_PATH);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
File newFile = new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png');
XWPFDocument doc = new XWPFDocument(file.getInputStream());
List<XWPFParagraph> paragraphs = doc.getParagraphs();
//计算总页数
int totalPages = 0;
for (XWPFParagraph paragraph : paragraphs) {
if (paragraph.isPageBreak()) {
totalPages++;
}
}
//将每一页转换为图片
for (int i = 0; i < totalPages; i++) {
doc.showPageBreaks(true);
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(WordToImageUtils.transfer(doc, i)));
ImageIO.write(bufferedImage, 'png', new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png'));
}
return newFile.getAbsolutePath();
}
private String uploadPptFile(MultipartFile file) throws IOException {
File uploadDir = new File(UPLOAD_PATH);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
File newFile = new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png');
XMLSlideShow ppt = new XMLSlideShow(file.getInputStream());
List<XSLFSlide> slides = ppt.getSlides();
//计算总页数
int totalPages = slides.size();
//将每一页转换为图片
for (int i = 0; i < totalPages; i++) {
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(SlideToImageUtils.transfer(slides.get(i))));
ImageIO.write(bufferedImage, 'png', new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png'));
}
return newFile.getAbsolutePath();
}
private String uploadPdfFile(MultipartFile file) throws IOException {
File uploadDir = new File(UPLOAD_PATH);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
File newFile = new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png');
PDDocument pdf = PDDocument.load(file.getInputStream());
PDPageTree pages = pdf.getPages();
//计算总页数
int totalPages = pages.getCount();
//将每一页转换为图片
for (int i = 0; i < totalPages; i++) {
BufferedImage bufferedImage = new PDFRenderer(pdf).renderImageWithDPI(i, 300, ImageType.RGB);
ImageIO.write(bufferedImage, 'png', new File(UPLOAD_PATH + '/' + UUID.randomUUID().toString() + '.png'));
}
return newFile.getAbsolutePath();
}
}
- 创建一个文件上传控制器:
@RestController
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
@PostMapping('/upload')
public String uploadFile(@RequestParam('file') MultipartFile file) throws IOException {
return fileUploadService.uploadFile(file);
}
}
- 测试上传一个 doc/ppt/pdf 文件并查看上传的图片是否已保存到指定文件夹中。
注意:以上代码仅供参考,具体实现方式可能因实际需求而有所不同。
注意:
WordToImageUtils和SlideToImageUtils是需要自行实现的工具类,用于将 Word 和 PPT 文件转换为图片。- 确保您已正确配置了依赖项,并且所需的库已包含在您的项目中。
- 您可以根据需要修改
UPLOAD_PATH变量的值,以指定文件保存的路径。 - 上传的文件将被重命名并保存为 PNG 图片。您可以根据需要修改文件类型和命名规则。
- 该代码仅演示基本功能,实际应用中可能需要进行更复杂的处理,例如错误处理、安全性验证等等。
原文地址: https://www.cveoy.top/t/topic/l4yX 著作权归作者所有。请勿转载和采集!