1<?php
2class=class="string">"keyword">header(class="string">'Content-Type: text/html; charset=utf-class="number">8');
3
4class=class="string">"keyword">class=class="string">"comment">// Handle QR code generation request via local Node.js server
5class=class="string">"keyword">if ($_SERVER[class="string">'REQUEST_METHOD'] === class="string">'POST' && class=class="string">"keyword">isset($_POST[class="string">'content'])) {
6 $content = trim($_POST[class="string">'content']);
7 $size = class=class="string">"keyword">isset($_POST[class="string">'size']) ? intval($_POST[class="string">'size']) : class="number">5;
8 $level = class=class="string">"keyword">isset($_POST[class="string">'level']) ? $_POST[class="string">'level'] : class="string">'M';
9
10 class=class="string">"keyword">if (class=class="string">"keyword">empty($content)) {
11 http_response_code(class="number">400);
12 class=class="string">"keyword">exit(class="string">'内容不能为空');
13 }
14
15 $validLevels = [class="string">'L', class="string">'M', class="string">'Q', class="string">'H'];
16 class=class="string">"keyword">if (!in_array($level, $validLevels)) $level = class="string">'M';
17
18 $payload = json_encode([
19 class="string">'content' => $content,
20 class="string">'size' => $size,
21 class="string">'level' => $level
22 ]);
23
24 $ch = curl_init(class="string">'http:class="keyword">class="comment">//class="number">127.0.class="number">0.1:class="number">3001/qr');
25 curl_setopt_array($ch, [
26 CURLOPT_POST => true,
27 CURLOPT_POSTFIELDS => $payload,
28 CURLOPT_HTTPHEADER => [class="string">'Content-Type: application/json'],
29 CURLOPT_RETURNTRANSFER => true,
30 CURLOPT_TIMEOUT => class="number">10,
31 ]);
32 $result = curl_exec($ch);
33 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
34 curl_close($ch);
35
36 class=class="string">"keyword">if ($httpCode !== class="number">200 || class=class="string">"keyword">empty($result)) {
37 http_response_code(class="number">500);
38 class=class="string">"keyword">exit(class="string">'二维码生成失败,请重试');
39 }
40
41 class=class="string">"keyword">header(class="string">'Content-Type: image/png');
42 class=class="string">"keyword">header(class="string">'Content-Disposition: inline; filename="qrcode.png"');
43 class=class="string">"keyword">header(class="string">'Content-Length: ' . strlen($result));
44 class=class="string">"keyword">header(class="string">'Cache-Control: no-cache');
45 class=class="string">"keyword">echo $result;
46 class=class="string">"keyword">exit;
47}
48?>
49<!DOCTYPE html>
50<class="tag">html lang="zh-CN">
51<class="tag">head>
52<class="tag">meta charset="UTF-class="number">8">
53<class="tag">meta name="viewport" content="width=device-width, initial-scale=class="number">1.0">
54<class="tag">meta property="og:title" content="二维码生成 - η空间">
55<class="tag">meta name="description" content="将网址、文字生成二维码图片,可自定义大小和纠错级别">
56<class="tag">meta name="keywords" content="在线二维码生成器,免费二维码,二维码图片,QR码生成">
57<class="tag">meta property="og:description" content="将网址、文字生成二维码图片,可自定义大小和纠错级别">
58<class="tag">meta property="og:type" content="website">
59<class="tag">title>二维码生成 - η空间</class="tag">title>
60<class="tag">link rel="stylesheet" href="/tools/share.css">
61 <class="tag">link rel="stylesheet" href="/assets/pet-cat.css">
62<class="tag">style>
63* { margin: class="number">0; padding: class="number">0; box-sizing: border-box; }
64body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: class=class="string">"keyword">class=class="string">"comment">#f0f2f5; color: #class="number">333; line-height: class="number">1.6; }
65class=class="string">"keyword">header {
66 background: linear-gradient(135deg, class=class="string">"keyword">class=class="string">"comment">#11998e class="number">0%, #38ef7d class="number">100%);
67 color: class=class="string">"keyword">class=class="string">"comment">#fff; padding: 30px 20px; text-align: center;
68}
69class=class="string">"keyword">header h1 { font-size: 24px; margin-bottom: 4px; }
70class=class="string">"keyword">header p { opacity: class="number">0.85; font-size: 14px; }
71.container { max-width: 520px; margin: class="number">0 auto; padding: 24px 16px; }
72.back-link { display: inline-block; margin-bottom: 16px; color:class=class="string">"keyword">class=class="string">"comment">#11998e; text-decoration: none; font-size: 14px; }
73.card { background: class=class="string">"keyword">class=class="string">"comment">#fff; border-radius: 12px; padding: 24px; box-shadow: class="number">0 2px 8px rgba(class="number">0,class="number">0,class="number">0,class="number">0.06); margin-bottom: 16px; }
74.form-group { margin-bottom: 16px; }
75.form-group label { display: block; font-size: 14px; font-weight: class="number">600; margin-bottom: 6px; }
76.form-group input, .form-group textarea, .form-group select {
77 width: class="number">100%; padding: 10px 12px; border: 1px solid class=class="string">"keyword">class=class="string">"comment">#ddd; border-radius: 8px; font-size: 14px;
78 font-family: inherit; transition: border-color class="number">0.2s;
79}
80.form-group input:focus, .form-group textarea:focus, .form-group select:focus {
81 outline: none; border-color: class=class="string">"keyword">class=class="string">"comment">#11998e;
82}
83.form-group textarea { min-height: 80px; resize: vertical; }
84.btn {
85 display: inline-block; padding: 10px 24px; border-radius: 8px;
86 border: none; font-size: 15px; cursor: pointer;
87 background: class=class="string">"keyword">class=class="string">"comment">#11998e; color: #fff; transition: opacity class="number">0.2s; width: class="number">100%;
88}
89.btn:hover { opacity: class="number">0.85; }
90.qr-result { display: none; margin-top: 20px; text-align: center; }
91.qr-result img { max-width: 300px; border-radius: 8px; border: 2px solid class=class="string">"keyword">class=class="string">"comment">#eee; }
92.qr-result .btn { display: inline-block; width: auto; margin-top: 12px; }
93footer { text-align: center; padding: 24px; color: class=class="string">"keyword">class=class="string">"comment">#class="number">999; font-size: 13px; }
94.spinner { display: none; margin: 20px auto; text-align: center; }
95.spinner::after {
96 content: class="string">''; display: inline-block; width: 32px; height: 32px;
97 border: 3px solid class=class="string">"keyword">class=class="string">"comment">#ddd; border-top-color: #11998e; border-radius: class="number">50%;
98 animation: spin class="number">0.8s linear infinite;
99}
100@keyframes spin { to { transform: rotate(360deg); } }
101</class="tag">style>
102</class="tag">head>
103<class="tag">body>
104
105<class=class="string">"keyword">header>
106 <class="tag">h1>📱 二维码生成</class="tag">h1>
107 <class="tag">p>输入文字或网址,一键生成二维码</class="tag">p>
108</class=class="string">"keyword">header>
109
110<class="tag">div class=class="string">"keyword">class="container">
111 <class="tag">a href="index.html" class=class="string">"keyword">class="back-link">← 返回工具列表</class="tag">a> · <class="tag">a href="/download/qr-generator.zip" style="color:class=class="string">"keyword">class=class="string">"comment">#667eea;font-size:13px;text-decoration:none;">📦 源码下载</class="tag">a>
112
113 <class="tag">div class=class="string">"keyword">class="card">
114 <class="tag">form id="qrForm" method="post">
115 <class="tag">div class=class="string">"keyword">class="form-group">
116 <class="tag">label>内容 <class="tag">span style="font-weight:class="number">400;color:class=class="string">"keyword">class=class="string">"comment">#class="number">999;">(网址、文字、电话号码等)</class="tag">span></class="tag">label>
117 <class="tag">textarea name="content" id="content" placeholder="例:https:class=class="string">"keyword">class=class="string">"comment">//class="number">273059.cn 或 你好世界" required></class="tag">textarea>
118 </class="tag">div>
119
120 <class="tag">div class=class="string">"keyword">class="form-group">
121 <class="tag">label>二维码尺寸</class="tag">label>
122 <class="tag">select name="size" id="size">
123 <class="tag">option value="class="number">3">小 (200x200)</class="tag">option>
124 <class="tag">option value="class="number">5" selected>中 (350x350)</class="tag">option>
125 <class="tag">option value="class="number">7">大 (500x500)</class="tag">option>
126 <class="tag">option value="class="number">10">超大 (800x800)</class="tag">option>
127 </class="tag">select>
128 </class="tag">div>
129
130 <class="tag">div class=class="string">"keyword">class="form-group">
131 <class="tag">label>纠错级别</class="tag">label>
132 <class="tag">select name="level" id="level">
133 <class="tag">option value="L">低 (class="number">7% 可损)</class="tag">option>
134 <class="tag">option value="M" selected>中 (class="number">15% 可损)</class="tag">option>
135 <class="tag">option value="Q">较高 (class="number">25% 可损)</class="tag">option>
136 <class="tag">option value="H">最高 (class="number">30% 可损)</class="tag">option>
137 </class="tag">select>
138 </class="tag">div>
139
140 <class="tag">button type="submit" class=class="string">"keyword">class="btn" id="generateBtn">生成二维码</class="tag">button>
141 </class="tag">form>
142
143 <class="tag">div class=class="string">"keyword">class="spinner" id="spinner"></class="tag">div>
144
145 <class="tag">div class=class="string">"keyword">class="qr-result" id="qrResult">
146 <class="tag">img id="qrImg" alt="二维码">
147 <class="tag">div style="margin-top:12px;font-size:13px;color:class=class="string">"keyword">class=class="string">"comment">#class="number">666;" id="qrContent"></class="tag">div>
148 <class="tag">a class=class="string">"keyword">class="btn" id="downloadQr" download="qrcode.png">⬇ 下载 PNG</class="tag">a>
149 </class="tag">div>
150 </class="tag">div>
151</class="tag">div>
152
153<class="tag">footer>
154 <class="tag">p>二维码在服务器生成,不会记录你的输入内容</class="tag">p>
155</class="tag">footer>
156
157<class="tag">script>
158class=class="string">"keyword">const form = document.class="func">getElementById(class="string">'qrForm');
159class=class="string">"keyword">const spinner = document.class="func">getElementById(class="string">'spinner');
160class=class="string">"keyword">const qrResult = document.class="func">getElementById(class="string">'qrResult');
161class=class="string">"keyword">const qrImg = document.class="func">getElementById(class="string">'qrImg');
162class=class="string">"keyword">const qrContent = document.class="func">getElementById(class="string">'qrContent');
163class=class="string">"keyword">const downloadQr = document.class="func">getElementById(class="string">'downloadQr');
164class=class="string">"keyword">const generateBtn = document.class="func">getElementById(class="string">'generateBtn');
165
166form.class="func">addEventListener(class="string">'submit', async (e) => {
167 e.preventDefault();
168
169 class=class="string">"keyword">const content = document.class="func">getElementById(class="string">'content').value.trim();
170 class=class="string">"keyword">if (!content) { class="func">alert(class="string">'请输入内容'); class=class="string">"keyword">return; }
171
172 class=class="string">"keyword">const size = document.class="func">getElementById(class="string">'size').value;
173 class=class="string">"keyword">const level = document.class="func">getElementById(class="string">'level').value;
174
175 spinner.style.display = class="string">'block';
176 qrResult.style.display = class="string">'none';
177 generateBtn.disabled = true;
178
179 try {
180 class=class="string">"keyword">const formData = class=class="string">"keyword">new FormData();
181 formData.append(class="string">'content', content);
182 formData.append(class="string">'size', size);
183 formData.append(class="string">'level', level);
184
185 class=class="string">"keyword">const res = await class="func">fetch(class="string">'qr-generator.php', {
186 method: class="string">'POST',
187 body: formData
188 });
189
190 class=class="string">"keyword">if (!res.ok) throw class=class="string">"keyword">new Error(class="string">'生成失败');
191
192 class=class="string">"keyword">const blob = await res.blob();
193 class=class="string">"keyword">const url = URL.createObjectURL(blob);
194
195 qrImg.src = url;
196 qrContent.textContent = class="string">'内容: ' + content;
197 downloadQr.href = url;
198 qrResult.style.display = class="string">'block';
199 } class="func">catch(err) {
200 class="func">alert(class="string">'生成失败,请重试: ' + err.message);
201 } finally {
202 spinner.style.display = class="string">'none';
203 generateBtn.disabled = false;
204 }
205});
206</class="tag">script>
207<class="tag">script src="/tools/share.js"></class="tag">script>
208<class="tag">script src="/assets/pet-cat.js"></class="tag">script>
209</class="tag">body>
210</class="tag">html>
Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/273059_cn/tools/source-viewer.php:69) in /www/wwwroot/273059_cn/tools/source-viewer.php on line 72
Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/273059_cn/tools/source-viewer.php:69) in /www/wwwroot/273059_cn/tools/source-viewer.php on line 73
$content,
'size' => $size,
'level' => $level
]);
$ch = curl_init('http://127.0.0.1:3001/qr');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200 || empty($result)) {
http_response_code(500);
exit('二维码生成失败,请重试');
}
header('Content-Type: image/png');
header('Content-Disposition: inline; filename="qrcode.png"');
header('Content-Length: ' . strlen($result));
header('Cache-Control: no-cache');
echo $result;
exit;
}
?>
二维码生成 - η空间
📱 二维码生成
输入文字或网址,一键生成二维码