图片上传扫码分享系统 · HTTP API 接入指南
本系统提供 HTTP API,允许第三方系统/小程序/App 直接上传图片(拍照/签名),并获取图片查看网址和二维码。
流程图第三方系统 ──上传图片──▶ QR Share API
│
▼
返回 view_url (查看网址)
│
▼
第三方根据 view_url 生成二维码
│
▼
用户扫码 → 打开查看页 → 预览/下载
| 接口 | 方法 | 认证 | 说明 |
|---|---|---|---|
| /api/upload.php | POST | Access Key | 上传图片(支持文件/Base64,可带预占 link_key) |
| /api/reserve_link.php | POST | Access Key | 🔑 上传前预占图片链接,提前获取查看链接/二维码 |
| /api/image_info.php | GET | link_key 或 Access Key | 查询图片详情与配置(含 pending/ready 状态) |
| /api/qrcode.php | GET | 公开 | 生成二维码图片(PNG) |
| /api/reset_link.php | POST | 管理员登录 | 重置图片链接(旧链接失效) |
⚠️ 以上 access_key 是调用上传接口的身份凭证,请妥善保管,不要泄露到前端代码中。
本系统使用 access_key 作为项目身份凭证,无需 token 或 OAuth。
access_key将 access_key 作为请求参数传递:
上传拍照或签名图片,返回图片查看网址、原图直链、二维码URL。
link_key 与 qrcode_url →
用二维码合成图片 → 上传本接口时额外携带 link_key 字段,系统即把该预占链接绑定到本次图片。
不传 link_key 时行为与原来完全一致(上传时自动生成新链接)。
URLhttps://qrshare.nsjia.cn/api/upload.php
支持两种上传方式:
适合前端表单、移动端WebView、原生HTTP客户端直接上传二进制文件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
access_key | string | 是 | 项目访问密钥 (16位) |
img_type | string | 是 | 图片类型: photo=拍照 / signature=签名 |
file | file | 是 | 图片文件 (二进制),支持 jpg/jpeg/png/gif/webp,最大 10MB |
project_id | int | 否 | 项目ID(可选,如填写需与access_key匹配) |
link_key | string | 否 | 预占的图片链接密钥(由 reserve_link.php 返回);传入则认领该链接,不传则自动生成新链接 |
HTTPPOST https://qrshare.nsjia.cn/api/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="access_key"
1a2b3c4d5e6f7890
------WebKitFormBoundary
Content-Disposition: form-data; name="img_type"
photo
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: image/jpeg
(二进制图片数据)
------WebKitFormBoundary--
适合服务端调用、无法使用multipart的场景。将图片转为Base64字符串后以JSON提交。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
access_key | string | 是 | 项目访问密钥 |
img_type | string | 是 | photo 或 signature |
file_base64 | string | 是 | 图片Base64编码,可带 data:image/xxx;base64, 前缀 |
filename | string | 否 | 原始文件名(用于判断扩展名) |
link_key | string | 否 | 预占的图片链接密钥(由 reserve_link.php 返回);传入则认领该链接,不传则自动生成新链接 |
JSONPOST https://qrshare.nsjia.cn/api/upload.php HTTP/1.1
Content-Type: application/json
{
"access_key": "1a2b3c4d5e6f7890",
"img_type": "photo",
"filename": "photo.jpg",
"file_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASA..."
}
JSON · 200{
"success": true,
"code": 0,
"msg": "上传成功",
"data": {
"image_id": 123,
"img_type": "photo",
"view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789",
"image_url": "https://qrshare.nsjia.cn/uploads/2026/08/xxx.jpg",
"qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300",
"link_key": "abc123def456ghi789",
"project_id": 1,
"project_name": "示例项目",
"upload_time": "2026-08-12 18:00:00"
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
data.view_url | string | 🔑 图片查看页网址,第三方用它生成二维码供用户扫码 |
data.image_url | string | 原图文件直链URL(可直链访问/嵌入) |
data.qrcode_url | string | 系统已生成的二维码图片URL(可直接作为img的src) |
data.link_key | string | 链接密钥(用于查询/重置接口) |
data.image_id | int | 图片记录ID |
data.view_url 用第三方工具生成二维码,或直接把 data.qrcode_url 作为二维码图片展示给用户扫码。用户扫码后自动打开图片预览/下载页。
适用场景:需要在图片上传之前就知道该图片未来的查看链接与二维码——先拿到二维码,把它合成/打印到图片上,再上传合成后的图片。上传成功后,预先生成的二维码扫码即可打开该图片。
reserve_link.php),拿到 link_key / view_url / qrcode_url;qrcode_url 的二维码PNG,合成到目标图片中;link_key,完成绑定(扫码即可查看)。URLhttps://qrshare.nsjia.cn/api/reserve_link.php
支持 application/json 与 application/x-www-form-urlencoded / multipart/form-data。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
access_key | string | 是 | 项目访问密钥 |
img_type | string | 否 | photo(默认) 或 signature |
JSONPOST https://qrshare.nsjia.cn/api/reserve_link.php HTTP/1.1
Content-Type: application/json
{
"access_key": "1a2b3c4d5e6f7890",
"img_type": "photo"
}
cURLcurl -X POST https://qrshare.nsjia.cn/api/reserve_link.php \
-d "access_key=1a2b3c4d5e6f7890" \
-d "img_type=photo"
JSON · 200{
"success": true,
"code": 0,
"msg": "链接预占成功",
"data": {
"link_key": "abc123def456ghi789abc123def456ghi7",
"view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789abc123def456ghi7",
"qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789abc123def456ghi7&s=300",
"qrcode_big": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789abc123def456ghi7&s=500",
"img_type": "photo",
"project_id": 1,
"project_name": "示例项目",
"status": "pending"
}
}
| 字段 | 说明 |
|---|---|
data.link_key | 预占的链接密钥,第3步上传时原样回传 |
data.view_url | 图片查看页网址(二维码编码内容) |
data.qrcode_url | 300px 二维码PNG直链,可直接下载或作为 img src |
data.qrcode_big | 500px 高清二维码PNG直链,适合印刷/合成 |
data.status | 固定为 pending;上传完成后通过 image_info.php 查询变为 ready |
link_key 只能被上传一次(重复上传返回 1016);link_key 必须与 access_key 属于同一项目,否则返回 1015;根据 link_key 或 image_id 查询图片详情,包含查看页配置(可用于第三方自定义展示)。
URLhttps://qrshare.nsjia.cn/api/image_info.php
| 方式 | 参数 | 说明 |
|---|---|---|
| 方式1 | ?link_key=xxx | 通过上传返回的 link_key 查询(公开) |
| 方式2 | ?image_id=123&access_key=xxx | 通过图片ID + 项目密钥查询 |
HTTPGET https://qrshare.nsjia.cn/api/image_info.php?link_key=abc123def456ghi789
JSON · 200{
"success": true,
"code": 0,
"msg": "ok",
"data": {
"image": {
"id": 123,
"project_id": 1,
"img_type": "photo",
"img_type_cn": "照片",
"create_time": "2026-08-12 18:00:00",
"link_key": "abc123def456ghi789",
"status": "ready"
},
"project": {
"id": 1,
"name": "示例项目",
"access_key": "1a2b3c4d5e6f7890",
"status_text": "运行中",
"end_time": null,
"is_expired": false,
"can_view": true
},
"urls": {
"view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789",
"image_url": "https://qrshare.nsjia.cn/uploads/2026/08/xxx.jpg",
"qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300",
"qrcode_big": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=500"
},
"view_config": {
"title": "图片预览",
"logo": "",
"subtitle": "长按图片或点击下方按钮可下载",
"footer": "© QR Share System",
"theme_color": "#4A90D9",
"bg_image": "",
"header_text": "",
"show_info": true,
"show_download": true
}
}
}
image.status: ready=图片已上传可查看;pending=链接已由 reserve_link.php 预占但图片尚未上传,此时 urls.image_url 为空字符串,而 view_url / qrcode_url 已可用,第三方可轮询本接口等待状态变为 ready。直接返回二维码 PNG 图片,可作为 <img> 的 src 使用。
URLhttps://qrshare.nsjia.cn/api/qrcode.php
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
text | string | 三选一 | 任意文本,直接生成该文本的二维码(优先级最高) |
k | string | 三选一 | 图片 link_key,生成图片预览页URL的二维码(图片上传后使用) |
ak | string | 三选一 | 项目 access_key,生成项目上传页URL的二维码(图片上传前即可生成,可提前打印张贴) |
s | int | 否 | 尺寸(像素),默认300,范围50-1000 |
HTML
<img src="https://qrshare.nsjia.cn/api/qrcode.php?ak=a1b2c3d4e5f6g7h8&s=300"
width="300" height="300" alt="扫码上传图片">
<img src="https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300"
width="300" height="300" alt="扫码查看图片">
<img src="https://qrshare.nsjia.cn/api/qrcode.php?text=https%3A%2F%2Fexample.com" alt="二维码">
image/png,可直接用于网页、小程序 image 标签等。已开启浏览器缓存(1小时)。text > k > ak(同时传入多个时只取最高优先级);key 无效时二维码内容为 invalid link / invalid access key 提示文本。ak 模式不校验项目启停状态,方便提前打印张贴二维码——项目关闭/过期时扫码打开的上传页会自行提示"通道已关闭"。重置图片的访问链接,旧链接立即失效,返回新链接。适合图片泄露后重新加密。
URLhttps://qrshare.nsjia.cn/api/reset_link.php
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
image_id | int | 是 | 要重置链接的图片ID |
JSON{
"success": true,
"new_link": "https://qrshare.nsjia.cn/view/?k=newkey1234567890abcdef"
}
PHP<?php
$ch = curl_init('https://qrshare.nsjia.cn/api/upload.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => [
'access_key' => '1a2b3c4d5e6f7890',
'img_type' => 'photo',
'file' => new CURLFile('/path/to/photo.jpg', 'image/jpeg'),
],
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['success']) {
echo "查看网址: " . $result['data']['view_url'] . "\n";
echo "二维码URL: " . $result['data']['qrcode_url'] . "\n";
echo "原图URL: " . $result['data']['image_url'] . "\n";
} else {
echo "上传失败: " . $result['msg'] . "\n";
}
PHP<?php
$imagePath = '/path/to/photo.jpg';
$base64 = 'data:image/jpeg;base64,' . base64_encode(file_get_contents($imagePath));
$payload = [
'access_key' => '1a2b3c4d5e6f7890',
'img_type' => 'signature',
'filename' => 'sign.png',
'file_base64' => $base64,
];
$ch = curl_init('https://qrshare.nsjia.cn/api/upload.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result['data']);
JavaScriptconst formData = new FormData();
formData.append('access_key', '1a2b3c4d5e6f7890');
formData.append('img_type', 'photo');
formData.append('file', fileInput.files[0]);
const res = await fetch('https://qrshare.nsjia.cn/api/upload.php', {
method: 'POST',
body: formData
});
const result = await res.json();
if (result.success) {
console.log('查看网址:', result.data.view_url);
console.log('二维码URL:', result.data.qrcode_url);
// 显示二维码
qrImg.src = result.data.qrcode_url;
} else {
alert('上传失败: ' + result.msg);
}
Pythonimport requests
url = 'https://qrshare.nsjia.cn/api/upload.php'
files = {'file': ('photo.jpg', open('/path/to/photo.jpg', 'rb'), 'image/jpeg')}
data = {
'access_key': '1a2b3c4d5e6f7890',
'img_type': 'photo',
}
response = requests.post(url, files=files, data=data)
result = response.json()
if result['success']:
print(f"查看网址: {result['data']['view_url']}")
print(f"二维码URL: {result['data']['qrcode_url']}")
else:
print(f"上传失败: {result['msg']}")
JavaOkHttpClient client = new OkHttpClient();
RequestBody formBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("access_key", "1a2b3c4d5e6f7890")
.addFormDataPart("img_type", "photo")
.addFormDataPart("file", "photo.jpg",
RequestBody.create(new File("/path/to/photo.jpg"),
MediaType.parse("image/jpeg")))
.build();
Request request = new Request.Builder()
.url("https://qrshare.nsjia.cn/api/upload.php")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
String body = response.body().string();
System.out.println(body);
}
C#using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("1a2b3c4d5e6f7890"), "access_key");
content.Add(new StringContent("photo"), "img_type");
using var fs = File.OpenRead("/path/to/photo.jpg");
content.Add(new StreamContent(fs), "file", "photo.jpg");
var response = await client.PostAsync("https://qrshare.nsjia.cn/api/upload.php", content);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
JavaScriptwx.uploadFile({
url: 'https://qrshare.nsjia.cn/api/upload.php',
filePath: tempImagePath, // wx.chooseImage 拿到的临时路径
name: 'file',
formData: {
access_key: '1a2b3c4d5e6f7890',
img_type: 'photo'
},
success: function(res) {
var result = JSON.parse(res.data);
if (result.success) {
console.log('查看网址:', result.data.view_url);
console.log('二维码URL:', result.data.qrcode_url);
} else {
wx.showToast({ title: result.msg, icon: 'none' });
}
}
});
| code | HTTP状态 | 说明 | 处理建议 |
|---|---|---|---|
| 0 | 200 | 成功 | - |
| 400 | 400 | JSON格式错误 | 检查请求体是否为合法JSON |
| 405 | 405 | 请求方法错误 | 使用 POST 请求 |
| 1000 | 200 | 缺少必要参数 | 检查 link_key 或 access_key+image_id |
| 1001 | 200 | 缺少 access_key | 添加 access_key 字段 |
| 1002 | 200 | access_key 无效 | 核对 access_key 是否正确 |
| 1003 | 200 | project_id 与 access_key 不匹配 | 使用 access_key 自动识别项目,无需 project_id |
| 1004 | 200 | 上传通道已关闭或项目已过期 | 联系管理员开启上传或延期项目 |
| 1005 | 200 | 未选择文件 | 检查 file 字段 |
| 1006 | 200 | 文件格式/大小不合法 | 使用 jpg/png/gif/webp,小于10MB |
| 1007 | 200 | 文件保存失败 | 检查服务器 uploads 目录权限 |
| 1008 | 200 | 缺少 file_base64 | JSON方式必须传 file_base64 |
| 1009 | 200 | Base64 解码失败 | 检查 Base64 字符串是否完整 |
| 1010 | 200 | 不支持的图片格式 | 从 MIME/filename 推断的扩展名不在白名单 |
| 1011 | 200 | 图片大小超限 | 压缩后上传,建议 < 8MB |
| 1012 | 200 | 无效的图片数据 | Base64 内容不是真实图片 |
| 1013 | 200 | 图片处理失败 | GD库异常,检查图片完整性 |
| 1014 | 200 | 记录保存失败 | 数据库异常,联系管理员 |
| 1015 | 200 | link_key 无效或不属于该项目 | 先用 reserve_link.php 预占链接,并确保 access_key 为同一项目 |
| 1016 | 200 | link_key 已被使用 | 每个预占链接只能上传一次,请重新预占 |
两种方式:
data.qrcode_url 作为 <img> 的 src 即可data.view_url 作为内容,通过第三方二维码生成库生成扫码后会打开图片预览页(view_url),页面应用项目配置的查看页样式(标题/LOGO/背景/主题色),支持:
取决于项目配置:
end_time 且已过期 → 上传接口拒绝新上传expire_policy=1 → 已上传图片仍可查看expire_policy=0 → 已上传图片禁止查看已开启 Access-Control-Allow-Origin: *,支持浏览器、小程序、App WebView 直接调用。
当前接口为单张上传,批量场景请循环调用。建议并发不超过 3 个,避免服务器压力。
删除图片需登录后台管理 → 图片管理 → 选择图片删除。暂未提供删除API。
联系管理员在后台停用项目或重建项目,旧 access_key 立即失效。