springboot框架中,通过servlet访问服务器目录以外的图片

88 阅读1分钟
package com.example;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/image")
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求参数中的图片文件名
        String fileName = request.getParameter("fileName");
        
        // 定义图片文件的绝对路径
        String filePath = "D:/images/" + fileName;
        File imageFile = new File(filePath);
        
        if (!imageFile.exists()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404 错误
            return;
        }

        // 获取文件的 MIME 类型
        String mimeType = getServletContext().getMimeType(imageFile.getAbsolutePath());
        if (mimeType == null) {
            mimeType = "application/octet-stream"; // 默认的 MIME 类型
        }

        // 设置响应内容类型
        response.setContentType(mimeType);
        response.setContentLength((int) imageFile.length());

        // 读取文件并写入响应输出流
        try (FileInputStream in = new FileInputStream(imageFile);
             OutputStream out = response.getOutputStream()) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
    }
}

3. 在 JSP 页面中发起请求

在 JSP 页面中,通过 <img> 标签发起请求,调用 ImageServlet 获取图片并显示:

jsp
コードをコピーする
<!DOCTYPE html>
<html>
<head>
    <title>Image Display</title>
</head>
<body>
    <h1>Display Image from External Directory</h1>
    <img src="${pageContext.request.contextPath}/image?fileName=sample.jpg" alt="Sample Image">
</body>
</html>

4. 配置 Servlet 映射

在 Spring Boot 中,可以通过 @ServletComponentScan 注解来扫描 Servlet 注解配置,或者手动注册 Servlet。

使用 @ServletComponentScan

在 Spring Boot 主应用类中添加 @ServletComponentScan 注解:

java
コードをコピーする
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

手动注册 Servlet

或者,可以通过配置类手动注册 Servlet:

java
コードをコピーする
package com.example;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServletConfig {

    @Bean
    public ServletRegistrationBean<ImageServlet> imageServlet() {
        ServletRegistrationBean<ImageServlet> registrationBean = new ServletRegistrationBean<>(new ImageServlet(), "/image");
        return registrationBean;
    }
}