Skip to content

Latest commit

 

History

History
221 lines (169 loc) · 5.36 KB

File metadata and controls

221 lines (169 loc) · 5.36 KB

HTTP图床服务实现指南

概述

已成功将原有的飞书图床服务替换为普通的HTTP图床服务,支持无认证的简单HTTP请求进行图片上传和下载。

实现的文件

1. HttpImageBedService.kt

位置: app/src/main/java/com/android/example/cameraxbasic/http/HttpImageBedService.kt

主要功能:

  • 使用 multipart/form-data 格式上传图片到 POST /upload 接口
  • 支持 URI 和字节数组两种上传方式
  • 自动生成基于时间戳的文件名
  • 返回 GET /download/<filename> 格式的下载链接
  • 提供连接测试功能

2. HttpImageBedConfig.kt

位置: app/src/main/java/com/android/example/cameraxbasic/http/HttpImageBedConfig.kt

配置项:

  • BASE_URL: 图床服务器基础URL(需要修改为实际服务器地址)
  • 超时时间配置(连接、读取、写入)

3. CameraFragment.kt 修改

  • FeishuImageBedService 替换为 HttpImageBedService
  • 更新相关的日志信息和错误提示

API 接口规范

上传接口

POST /upload
Content-Type: multipart/form-data

参数:
- file: 图片文件 (multipart field)

响应:
- 成功: HTTP 200,返回任意内容
- 失败: 非200状态码

下载接口

GET /download/<filename>

响应:
- 成功: HTTP 200,返回图片文件
- 失败: 非200状态码

配置步骤

1. 修改服务器地址

编辑 HttpImageBedConfig.kt 文件:

object HttpImageBedConfig {
    // 修改为你的实际服务器地址
    const val BASE_URL = "https://your-image-server.com/api"
}

2. 服务器端实现参考

Node.js + Express 示例

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();

// 配置文件存储
const storage = multer.diskStorage({
  destination: 'uploads/',
  filename: (req, file, cb) => {
    // 使用客户端提供的文件名
    cb(null, file.originalname);
  }
});

const upload = multer({ storage });

// 上传接口
app.post('/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: 'No file uploaded' });
  }
  res.json({ message: 'Upload successful', filename: req.file.filename });
});

// 下载接口
app.get('/download/:filename', (req, res) => {
  const filename = req.params.filename;
  const filepath = path.join(__dirname, 'uploads', filename);
  res.sendFile(filepath);
});

app.listen(3000, () => {
  console.log('图床服务器运行在端口 3000');
});

Python + Flask 示例

from flask import Flask, request, jsonify, send_from_directory
import os

app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'}), 400
    
    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400
    
    filename = file.filename
    file.save(os.path.join(UPLOAD_FOLDER, filename))
    return jsonify({'message': 'Upload successful', 'filename': filename})

@app.route('/download/<filename>')
def download_file(filename):
    return send_from_directory(UPLOAD_FOLDER, filename)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000, debug=True)

功能特性

1. 自动文件名生成

  • 格式: camera_{timestamp}.jpg
  • 示例: camera_1640995200000.jpg

2. 错误处理

  • 网络连接失败
  • 服务器响应错误
  • 文件创建失败
  • 详细的日志记录

3. 资源管理

  • 自动清理临时文件
  • 正确关闭网络连接

4. 异步处理

  • 使用 Kotlin 协程进行异步上传
  • 不阻塞主线程

测试步骤

1. 本地测试

# 启动本地测试服务器
cd your-server-directory
npm install express multer  # Node.js
node server.js

# 或者 Python
pip install flask
python server.py

2. 修改配置

const val BASE_URL = "http://10.0.2.2:3000/api"  // Android模拟器
//
const val BASE_URL = "http://192.168.1.100:3000/api"  // 实际设备

3. 运行应用

  • 编译并运行Android应用
  • 拍照测试上传功能
  • 检查logcat日志确认上传状态

日志信息

应用会输出详细的日志信息:

D/HttpImageBed: 开始上传图片到HTTP图床: content://...
D/HttpImageBed: 开始上传文件: camera_1640995200000.jpg, 大小: 1234567 bytes
I/HttpImageBed: 图片上传成功,响应: {"message":"Upload successful"}
I/HttpImageBed: 图片下载URL: https://your-server.com/api/download/camera_1640995200000.jpg

与飞书图床的差异

功能 飞书图床 HTTP图床
认证 需要App ID/Secret 无需认证
上传接口 /drive/v1/medias/upload_all /upload
下载接口 需要获取临时链接 /download/<filename>
文件管理 飞书云盘管理 服务器文件系统
依赖 飞书开放平台 自建服务器

故障排除

1. 连接失败

  • 检查服务器地址是否正确
  • 确认服务器是否运行
  • 检查网络连接

2. 上传失败

  • 检查服务器上传接口实现
  • 确认multipart/form-data格式正确
  • 查看服务器日志

3. 下载失败

  • 检查文件是否存在
  • 确认下载接口路径正确
  • 检查文件权限

这个新的HTTP图床实现更加简单灵活,便于自定义和维护。