2 changed files with 71 additions and 1 deletions
@ -0,0 +1,69 @@ |
|||||
|
package com.gxwebsoft.common.core.controller; |
||||
|
|
||||
|
import cn.hutool.extra.qrcode.QrCodeUtil; |
||||
|
import cn.hutool.extra.qrcode.QrConfig; |
||||
|
import com.gxwebsoft.common.core.web.ApiResult; |
||||
|
import com.gxwebsoft.common.core.web.BaseController; |
||||
|
import io.swagger.v3.oas.annotations.Operation; |
||||
|
import io.swagger.v3.oas.annotations.tags.Tag; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
import javax.annotation.Resource; |
||||
|
import javax.servlet.http.HttpServletResponse; |
||||
|
import java.awt.*; |
||||
|
import java.io.IOException; |
||||
|
|
||||
|
/** |
||||
|
* 二维码生成控制器 |
||||
|
* |
||||
|
* @author WebSoft |
||||
|
* @since 2025-08-18 |
||||
|
*/ |
||||
|
@RestController |
||||
|
@RequestMapping("/api") |
||||
|
@Tag(name = "二维码生成API") |
||||
|
public class QrCodeController extends BaseController { |
||||
|
|
||||
|
@Operation(summary = "生成二维码") |
||||
|
@GetMapping("/create-qr-code") |
||||
|
public void createQrCode( |
||||
|
@RequestParam("data") String data, |
||||
|
@RequestParam(value = "size", defaultValue = "200x200") String size, |
||||
|
HttpServletResponse response) throws IOException { |
||||
|
|
||||
|
try { |
||||
|
// 解析尺寸
|
||||
|
String[] dimensions = size.split("x"); |
||||
|
int width = Integer.parseInt(dimensions[0]); |
||||
|
int height = dimensions.length > 1 ? Integer.parseInt(dimensions[1]) : width; |
||||
|
|
||||
|
// 验证尺寸范围,防止过大的图片
|
||||
|
if (width < 50 || width > 1000 || height < 50 || height > 1000) { |
||||
|
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); |
||||
|
response.getWriter().write("尺寸必须在50-1000像素之间"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// 配置二维码
|
||||
|
QrConfig config = new QrConfig(width, height); |
||||
|
config.setMargin(1); |
||||
|
config.setForeColor(Color.BLACK); |
||||
|
config.setBackColor(Color.WHITE); |
||||
|
|
||||
|
// 设置响应头
|
||||
|
response.setContentType("image/png"); |
||||
|
response.setHeader("Cache-Control", "no-cache"); |
||||
|
response.setHeader("Content-Disposition", "inline; filename=qrcode.png"); |
||||
|
|
||||
|
// 生成二维码并直接输出到响应流
|
||||
|
QrCodeUtil.generate(data, config, "png", response.getOutputStream()); |
||||
|
|
||||
|
} catch (NumberFormatException e) { |
||||
|
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); |
||||
|
response.getWriter().write("尺寸格式错误,请使用如:200x200 的格式"); |
||||
|
} catch (Exception e) { |
||||
|
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
||||
|
response.getWriter().write("生成二维码失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue