使用Python实现一个简单的图片上传存储服务

GitHub地址: https://github.com/honmaple/maple-file

使用flask实现的一个简单的图片上传服务

设计初衷

对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛
自定义域名竟然需要域名备案(Excuse me,当初就是因为备案麻烦才选择国外的),而且浪费了我十块钱,

而我又想像七牛一样可以直接在本地就可以上传图片,找来找去,没有找到一个比较合适的,所以花两天时间自己写了一个

使用

由于初衷是本地脚本就可以发布,所以没有前端界面,等以后有时间了再加上

API

  • /api/login

    • POST

      登录
  • /api/logout

    • GET

      注销
  • /api/albums

    • GET
      获取相册列表

    • POST
      新建相册

      • name 相册名称

      • description 相册描述

  • /api/albums/<int:pk>

    pk 相册ID

    • GET
      获取相册信息

    • PUT
      修改相册信息

      • name 相册名称

      • description 相册描述

    • DELETE
      删除相册

  • /api/images

    • GET
      获取图片列表

    • POST
      上传图片

      • images 上传图片列表

      • album 相册ID(默认会新建一个default相册)

  • /api/images/<int:pk>

    • GET
      获取图片信息

    • PUT
      修改图片信息

      • name 图片名称

      • description 图片描述

    • DELETE
      删除图片

配置

class Config(object):
    DEBUG = True # 生产环境设置为False
    SECRET_KEY = 'ccc' # import os;os.urandom(24)
    SECRET_KEY_SALT = 'ssss'
    JSON_AS_ASCII = False

    PERMANENT_SESSION_LIFETIME = timedelta(days=3)

    PER_PAGE = 10 # 分页
    ADMIN_URL = '/admin/aaaaa' # 后台地址

    LOGIN_TOKEN_HEADER = 'Api-Key' # 将会影响到后面headers设置
    LOGIN_TOKEN = 'api_key' #url?api_key=21312313

    MIDDLEWARE = ['storage.common.middleware.CommonMiddleware']

    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'
    # SQLALCHEMY_ECHO = DEBUG
    UPLOAD_ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg']) # 允许上传的扩展名
    UPLOAD_FOLDER_ROOT = os.path.dirname(os.path.abspath(__file__))
    UPLOAD_FOLDER_PATH = 'images' # 相对于当前文件路径的地址
    UPLOAD_FOLDER = os.path.join(UPLOAD_FOLDER_ROOT, UPLOAD_FOLDER_PATH)

创建账户

python manager.py create_user

将同时创建一个default的相册

python manager.py key

显示用户key

上传

上传后图片保存路径

  • 原图路径:

    UPLOAD_FOLDER + 'username' + 'photo' + %Y + %m + (时间戳+随机数).png
    
  • 缩略图路径:

    UPLOAD_FOLDER + 'username' + 'thumb' + %Y + %m + (时间戳+随机数).png
    

example

使用requests本地上传

import requests

def images():
    url = 'http://127.0.0.1:8000/api/images'
    files = {'images': open('desktop.png', 'rb')}
    multiple_files = [
        ('images', ('11.png', open('11.png', 'rb'), 'image/png')),
        ('images', ('desktop.png', open('desktop.png', 'rb'), 'image/png'))
    ]
    headers = {
        'Api-Key':
        'InhpeWFuZzA4MDdJBtx4AWlPpI_Oxx1Ki8',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'
    }
    # r = requests.post(url, files=multiple_files, headers=headers)
    r = requests.post(url, files=files, headers=headers)
    print(r.text)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个基于 Flask 的图片上传功能的示例代码。首先,您需要安装 Flask 和 Flask-Uploads 两个 Python 包。 安装完毕后,您可以使用以下代码创建一个简单图片上传应用: ```python from flask import Flask, render_template, request from flask_uploads import UploadSet, configure_uploads, IMAGES app = Flask(__name__) # 配置上传文件的存储目录和允许上传的文件类型 app.config['UPLOADED_PHOTOS_DEST'] = 'uploads' photos = UploadSet('photos', IMAGES) configure_uploads(app, photos) @app.route('/') def index(): return render_template('index.html') @app.route('/upload', methods=['POST']) def upload(): # 从请求中获取上传的文件 file = request.files['photo'] # 保存文件到本地 filename = photos.save(file) # 返回上传后的文件名 return filename if __name__ == '__main__': app.run(debug=True) ``` 其中,`/upload` 路由处理图片上传请求,`request.files['photo']` 获取上传的图片文件,`photos.save(file)` 将图片保存到指定的目录中,并返回图片文件名。 您可以在 `templates/index.html` 文件中添加一个表单,用于上传图片: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片上传</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="photo"> <button type="submit">上传图片</button> </form> </body> </html> ``` 最后,运行应用并访问 `http://localhost:5000` 即可上传图片。上传后的图片将保存在 `uploads` 目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值