用Flask寫一個上傳圖片的API

25minutes發表於2021-09-09

話說星期一的時候,我們資料組開會佈置這個禮拜的人。組長這樣跟我說:
“這兩天你把上禮拜爬的那幾萬張圖片都上傳到阿里雲去”
“嗯”
“還有把裡面的廣告啊水印啊都去掉,我這裡買個網易雲盾讓你用”
“嗯”
“這些星期三大概就完成了”
“嗯”
“然後你用flask寫一個上傳圖片的API,方便以後使用,這樣就不需要每次都再爬蟲那裡處理圖片”
“哈?”
“哈!”
“什麼?”
“你不是會flask的麼”
“會啊!”
“那不就得了”
“。。。。。”
我當時心裡是這樣想的:
1.寫一個專門用來上傳圖片的程式,部署到伺服器?難道是亞馬遜的lambada那個按次收費的服務,跑一次就給一次錢?可是,圖片上傳為什麼要用flask?
2.flask的API不是用來返回json格式的麼,怎麼上傳圖片啊?我先傳好圖片,寫進資料庫,然後flask從資料庫讀取?
怎麼都想不通,到底是要幹什麼啊。然後,我就糾結了一個晚上。結果第二天睡醒,一道靈光打進我天靈蓋,突然醒悟了:MDZZ。。。。誰說flask不能寫上傳圖片的功能的。。。而且還想用亞馬遜那個按次收費跑程式碼的服務。。。我二啊,直接把flask部署到伺服器,愛怎麼用就怎麼用了。

我的思路清晰了:
Flask的API就使用用來返回的json。我要把原圖片地址作為引數傳遞給Flask,然後經過裡面的函式處理把圖片上傳,最後返回上傳後的圖片地址給我。
下面是效果圖

圖片描述

IMG_3818.PNG


思路有了,那就開始寫程式碼了

先寫個連線伺服器和上傳功能的utils
utils

import sys
import os
import oss2
import uuid
import requestsclass QssClient(object):
    def __new__(cls, *args, **kw):        if not hasattr(cls, '_instance'):
            orig = super(QssClient, cls)
            cls._instance = orig.__new__(cls, *args, **kw)        return cls._instance    def __init__(self):
        auth = #認證的秘鑰
        endpoint = #伺服器域名
        bucket_name =#伺服器的盤名
        self.bucket = oss2.Bucket(auth, endpoint, bucket_name, connect_timeout=30)        super(QssClient, self).__init__()    def upload(self, file_path, dir_name='資料夾名'):
        file_name = str(uuid.uuid1())
        with open(file_path, 'rb') as f:
            remote = '%s/%s.jpg' % (dir_name, str(file_name))
            result = self.bucket.put_object(remote, f)
            file_url = result.resp.response.url
            f.close()
        os.remove(file_path)        return file_url    def upload_list(self, file_list, dir_name='location'):
        file_url_list = []        for f in file_list:
            file_url = self.upload(f, dir_name=dir_name)
            file_url_list.append(file_url)        return file_url_list

然後寫個Flask的run
run

from flask import Flask, jsonify,requestfrom utils import QssClientimport urllibimport os

app = Flask(__name__)

tasks = [
    {        'id': 1,        'image_url': 'url from website',        'ali_url': 'url from ali',        'done': False
    },
    {        'id': 2,         'image_url': 'url from website',        'ali_url': 'url from ali',        'done': False
    }
]@app.route('/tasks', methods=['GET'])def get_tasks():
    return jsonify({'tasks': tasks})@app.route('/pics', methods=['POST'])def create_task():
    if not request.json or not 'image_url' in request.json:
        abort(400)



    urllib.urlretrieve(request.json['image_url'], 'pics\' + request.json['image_url'].split('/')[-1] )#先儲存圖片到本地
    qs = QssClient()#連線伺服器
    dir_name = 'location'#設定好伺服器儲存的資料夾
    full_file_lis = []
    file_path = os.path.join('pics\', request.json['image_url'].split('/')[-1])#從本地的儲存路徑獲得圖片
    full_file_lis.append(file_path)
    url = qs.upload_list(full_file_lis, dir_name)[0]從本地上傳圖片並獲得上傳後的地址

    task = {        'id': tasks[-1]['id'] + 1,        'image_url': request.json['image_url'],        'ali_url': url,        'done': False
    }
    tasks.append(task)    return jsonify({'task': task}), 201#返回圖片地址的json@app.route('/')def index():
    return "Hello, World!"if __name__ == '__main__':
    app.run(debug=True)

把這個API寫完並部署好以後,我突然覺得自己吊吊的。以前沒工作時總聽一些程式設計師前輩說寫API的,原來這就是寫API啊!今天算是第一次啦!
我正洋洋得意的時候,突然聽到外面總經理妹子在哪裡吼“剛才面試的人呢?把他叫回來,忘記讓他做筆試題了!!!”
我弱弱地問“郵箱寄給他不行麼?”
“不現場做,難道讓他回去百度呀?”
我的心裡突然拔涼拔涼的。。。。。你當初不就是直接手機發了份題讓我在家百度的,做完以後直接錄用我的麼?
難道,你不是看上我的才華才請我的?`



作者:LEONYao
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2810045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章