You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java实现图片与PDF文件的后端数据库上传及检索

Hey there! Building a Java system to upload images/PDFs to a database and enable easy search is totally doable, and I’ve got a practical, step-by-step approach to share with you. Let’s dive in.

Java实现图片与PDF上传及检索系统

一、核心思路与前置准备

First, let’s map out the flow:

  • Frontend sends image/PDF files to a backend API
  • Backend processes the file, stores it (either as binary in DB or on a file system), and saves metadata to the database
  • Build search endpoints to retrieve files by name, type, keywords, or even content (for advanced use cases)

For quick development, I’ll use Spring Boot with Spring Web (for file handling), Spring Data JPA (for DB operations), and Apache Commons IO (optional, but simplifies file stream work).

二、数据库设计

You have two storage strategies—pick the one that fits your needs:

This keeps your database lean and fast. Create a table to store file metadata:

CREATE TABLE file_metadata (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    original_file_name VARCHAR(255) NOT NULL,
    file_type VARCHAR(50) NOT NULL, -- e.g., image/png, application/pdf
    file_size BIGINT NOT NULL,
    upload_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    file_storage_path VARCHAR(500) NOT NULL, -- path to the file on disk/cloud
    search_keywords TEXT -- user-defined tags or extracted content for search
);

Option 2: Store Binary Directly in DB

Use this only if compliance or simplicity requires all data in the DB. Modify the table to add a LONGBLOB column:

ALTER TABLE file_metadata ADD COLUMN file_binary LONGBLOB;

三、Backend Upload API Implementation

First, set file size limits in application.properties:

spring.servlet.multipart.max-file-size=15MB
spring.servlet.multipart.max-request-size=15MB

Controller for Uploads

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

@RestController
public class FileUploadController {

    // Configure this path in application.properties for production
    private static final String UPLOAD_ROOT = "./app_uploads/";

    private final FileMetadataRepository metadataRepo;

    // Constructor injection (Spring Boot handles this)
    public FileUploadController(FileMetadataRepository metadataRepo) {
        this.metadataRepo = metadataRepo;
    }

    @PostMapping("/api/files/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file,
                            @RequestParam(required = false) String keywords) throws IOException {
        // Validate file type
        String contentType = file.getContentType();
        if (!contentType.startsWith("image/") && !"application/pdf".equals(contentType)) {
            return "Error: Only images and PDF files are allowed!";
        }

        // Create upload directory if it doesn't exist
        File uploadDir = new File(UPLOAD_ROOT);
        if (!uploadDir.exists()) uploadDir.mkdirs();

        // Generate unique filename to avoid overwrites
        String uniqueFileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
        String fullPath = UPLOAD_ROOT + uniqueFileName;

        // Save file to disk
        Files.copy(file.getInputStream(), Paths.get(fullPath));

        // Save metadata to DB
        FileMetadata metadata = new FileMetadata();
        metadata.setOriginalFileName(file.getOriginalFilename());
        metadata.setFileType(contentType);
        metadata.setFileSize(file.getSize());
        metadata.setFileStoragePath(fullPath);
        metadata.setSearchKeywords(keywords);
        metadataRepo.save(metadata);

        return "File uploaded successfully! File ID: " + metadata.getId();
    }
}

Entity Class for Metadata

import jakarta.persistence.*;
import java.util.Date;

@Entity
@Table(name = "file_metadata")
public class FileMetadata {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String originalFileName;

    @Column(nullable = false)
    private String fileType;

    @Column(nullable = false)
    private Long fileSize;

    @Column(name = "upload_timestamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Date uploadTimestamp = new Date();

    @Column(nullable = false)
    private String fileStoragePath;

    @Lob
    private byte[] fileBinary; // Use this only if storing binary in DB

    private String searchKeywords;

    // Getters and Setters (generate these with your IDE)
}

四、Search/Retrieval Implementation

Add these methods to your FileMetadataRepository (Spring Data JPA will implement them automatically):

import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface FileMetadataRepository extends JpaRepository<FileMetadata, Long> {
    // Search by filename (case-insensitive)
    List<FileMetadata> findByOriginalFileNameContainingIgnoreCase(String fileName);

    // Filter by file type (e.g., "application/pdf")
    List<FileMetadata> findByFileType(String fileType);

    // Search by keywords
    List<FileMetadata> findBySearchKeywordsContainingIgnoreCase(String keyword);
}

Search Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class FileSearchController {

    private final FileMetadataRepository metadataRepo;

    public FileSearchController(FileMetadataRepository metadataRepo) {
        this.metadataRepo = metadataRepo;
    }

    @GetMapping("/api/files/search")
    public List<FileMetadata> searchFiles(
            @RequestParam(required = false) String fileName,
            @RequestParam(required = false) String fileType,
            @RequestParam(required = false) String keyword) {

        if (fileName != null) {
            return metadataRepo.findByOriginalFileNameContainingIgnoreCase(fileName);
        } else if (fileType != null) {
            return metadataRepo.findByFileType(fileType);
        } else if (keyword != null) {
            return metadataRepo.findBySearchKeywordsContainingIgnoreCase(keyword);
        }

        // Return all files if no filters are applied
        return metadataRepo.findAll();
    }
}

五、Advanced Enhancements

  • Content-Based Search: For PDFs, use Apache PDFBox to extract text and save it to searchKeywords. For images, use Tesseract OCR to extract text from scanned docs/images.
  • Cloud Storage: Replace local file storage with S3/OSS—store the file URL in fileStoragePath instead of a local path.
  • File Preview: Add an endpoint to return file streams for frontend preview:
    @GetMapping("/api/files/preview/{id}")
    public ResponseEntity<byte[]> previewFile(@PathVariable Long id) throws IOException {
        FileMetadata metadata = metadataRepo.findById(id)
                .orElseThrow(() -> new RuntimeException("File not found"));
    
        byte[] fileBytes = Files.readAllBytes(Paths.get(metadata.getFileStoragePath()));
    
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(metadata.getFileType()))
                .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + metadata.getOriginalFileName() + "\"")
                .body(fileBytes);
    }
    

内容的提问来源于stack exchange,提问作者Pooja Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:02:34