Flask实现图片(文件)的(批量)上传、下载及示例代码

使用Flask实现本地图片上传和显示,支持mysql存储 注意:将图片直接保存到数据库可能不是最佳实践,因为这可能会导致数据库大小急剧增长,并可能影响查询性能。在大多数情况下,建议将图片保存到文件系统,并在数据库中存储图片的路径或URL。要使用FLask框架实现图片上传和显示,首先需要创建Flask框架的项目(使用pycharm专业版)需要创建上传图片的路径,路径必须放在static目录下,否则框架不支持显示图片。需要在templates目录下创建两个html,一个用来上传,一个用来显示。uploade.html上传图片页面。运行后可在数据库中查看到路径。 阅读详情

一、图片的单张上传(包括图片的尺寸压缩)

图片上传的基本思想大概是这样,前端用一个表单中type为file的input标签作为图片上传的前台发起上传,并以ajax把整个表单发送到后台,后台则是接收到图对象,加以处理,保存到服务器指定目录即可。首先先介绍下前台的代码,以及上传文件的form表单。

form表单如下:

from flask_wtf import FlaskForm

from wtforms import FileField

from app import label

from flask_wtf.file import FileField, FileRequired, FileAllowed

from config import ALLOWED_EXTENSIONS

class ImgForm(FlaskForm):

    photo = FileField(validators=[FileAllowed(ALLOWED_EXTENSIONS, message=label('_allow_img', [str(ALLOWED_EXTENSIONS)]))])

其中的config 如下:

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

其中的label为如下:

def label(name, values=[], path=None):

    '''
        默认从app目录下的guide导入所需变量
        name 导入的数据变量名
        values 数据类型必须市列表,提示的动态内容
        path 为导入的路径 name
    '''
    path = ".".join(path.split(".")[:-1]) + ".guide:" if path else "app.guide:"
    msg = import_string(path + name)
    return msg.format(values) if len(values) else msg

_allow_img       = '''图片的格式只能{0[0]}'''

后台的视图函数则是实例化该ImgForm,传到前台,前台的html代码为:

<form id="img_file" method='POST' enctype=multipart/form-data>
    {{ imgform.hidden_tag() }}
    <div class="fileupload btn btn-primary btn-xs">
        <span class="btn-text">上传图片</span>
        {{ imgform.photo(class="upload") }}
    </div>
</form>

hidden_tag()一定不要漏掉,不然后台将无法获取到我们传到后台的数据。js代码如下:

$('#img_file #photo').on('change',function(){ 
    var imgform = new FormData(document.getElementById("img_file")); 
    imgform.append ("key" , "value")
    $.ajax({
        url:'{{ url_for("app.upload_img") }}',
        type:"POST",
        dataType:'json',
        data:imgform,
        cache: false,  
        processData: false,  
        contentType: false, 
        success:function(response){  
            alert('上传成功')
        },  
        error:function(e){  
            alert('上传失败')
        } 
    })
})

其中的imgform.append,则是给form对象添加我们想要传到后台的数据,比如你要传一个name为MuMu的数据到后台就可以这么写:

imgform.append ("name" , "MuMu");

flask后台接口:

from PIL import Image 
@app.route('/upload_img', methods=['POST'])
def upload_img():
    form = ImgForm()
    if form.validate():
        file = request.files['photo']
        MuMu = request.form.get('name')
        img = Image.open(file)
        img_w, img_h = img.size
        img_name_path = os.getcwd() + label('_img_name_path')
        img_name = get_line(img_name_path, 1)
        set_size(img, img_w, img_h, 1.0, img_name_path, img_name+'_L', '.png')
        set_size(img, img_w, img_h, 0.5, img_name_path, img_name+'_M', '.png')
        set_size(img, img_w, img_h, 0.2, img_name_path, img_name+'_S', '.png')
        imgL = img_name+'_L.png'
        imgM = img_name+'_M.png'
        imgS = img_name+'_S.png'
        add_img(imgL, MuMu)
        add_img(imgM, MuMu)
        add_img(imgS, MuMu)
        result = {'success':label('_update_succ')}
    else:
        result = form.errors
	return json.dumps(result)

其中set_size函数为图片处理函数,如下:

def set_size(im, imgw, imgh, size, path, name, Suffix):
    img_w, img_h = int(imgwsize), int(imghsize)
    img = im.resize((img_w, img_h), Image.ANTIALIAS)
    imgpath = path + name + Suffix
    img.save(imgpath)

二、图片的批量上传(包括图片的尺寸压缩)

图片的保存到制定目录跟单张的一样,唯一区别在于,批量上传是以压缩文件的形式上传,思路是先上传到制定目录,然后解压出来,再把里面的图片保存到制定目录,最后再移除压缩文件与解压出来的文件。前台代码跟上面的上传图片类似,就不再重复介绍。主要介绍一下上传压缩文件后的从图片图片处理过程。假设现在已经上传了压缩文件。后台处理接口如下:

@app.route('/upload/imgfile', methods=['POST'])
def upload_imgfile():
    form = FileForm()
    if form.validate():
        file = request.files['name']
        sku_path = '/app/product/csv/'
        uploadname = upload_file(sku_path, file, flag=False)
        file_list=[]
        imgs={}
        child_file = []
        if uploadname:
            file_path = os.getcwd() + sku_path + uploadname
            if uploadname[-3:] == 'zip':
                filename=un_zip(file_path)
            elif uploadname[-3:] == 'tar':
                filename=un_tar(file_path)
            for i in os.walk(filename):
                        file_list.append(i)
                    for j in file_list:
                        for k in file_list[1][1]:
                            pathn = file_list[1][0] + '/' + k
                            if pathn == j[0]:
                                imgs[k]=j[2]
                    for key in imgs:
                        for img_l in imgs[key]:
                            file = file_list[1][0]+'/'+key +'/'+img_l
                            img = Image.open(file)
                            img_w, img_h = img.size
                            img_name_path = os.getcwd() + label('_img_name_path')
                            img_name = get_line(img_name_path, 1)
                            set_size(img, img_w, img_h, 1.0, img_name_path, img_name+'_L', '.png')
                            set_size(img, img_w, img_h, 0.5, img_name_path, img_name+'_M', '.png')
                            set_size(img, img_w, img_h, 0.2, img_name_path, img_name+'_S', '.png')
                            imgL = img_name+'_L.png'
                            imgM = img_name+'_M.png'
                            imgS = img_name+'_S.png'
                            add_img(imgL, img_l[:-4])
                            add_img(imgM, img_l[:-4])
                            add_img(imgS, img_l[:-4])
                    remove_file(sku_path, filename[:-1], flag=False)
                    remove_file(sku_path, uploadname)
                result = {'success':label('_update_succ')}
            else:
                result = form.errors
            return json.dumps(result)

其中un_zip、un_tar解压函数以及文件移除函数如下,需要注意的是移除单个文件只需要remove即可,而如果想移除一个文件夹则需要用rmtree方法才能移除,详情如下:

def remove_file(path, filename, flag=True):
    '''
    删除文件
        判断文件是否存在,存在则删除
    '''
    path = BASE_PATH + path
    filename = os.path.join(path, filename)
    if os.path.exists(filename):
        if flag:
            os.remove(filename)
        else:
            shutil.rmtree(filename)
            
def upload_file(path, file, flag=True):
    '''
    上传文件
    '''
    if flag:
        name = int(time.time()*1000)
    else:
        name = file.filename
    if file:
        path = BASE_PATH + path
        file.save(os.path.join(path, str(name)))
	return name

def un_zip(file_name):
    """unzip zip file"""
    zip_file = zipfile.ZipFile(file_name)
    if os.path.isdir(file_name[:-4] + "files"):
        pass
    else:
        os.mkdir(file_name[:-4] + "files")
    for names in zip_file.namelist():
        zip_file.extract(names, file_name[:-4] + "files/")
    zip_file.close()
	return (file_name[:-4] + "files/")

def un_tar(file_name):
    tar = tarfile.open(file_name)
    names = tar.getnames()
    if os.path.isdir(file_name[:-4] + "files"):
        pass
    else:
        os.mkdir(file_name[:-4] + "files")

    for name in names:
        tar.extract(name, file_name[:-4] + "files/")
    tar.close()

    return (file_name[:-4] + "files/")

其中的get_line函数则是一个操作txt文件的函数,我们事先把图片名放在txt中,上传一张图片就从文件中提取出一行图片名,并删除一行,若删除图片则写回txt中,这是个一个良好的解决命名冲突的问题。代码如下:

def get_line(file, del_line):
    with open(file, 'r') as old_file:
        with open(file, 'r+') as new_file:
			current_line = 0
            # 定位到需要删除的行
            while current_line &lt; (del_line - 1):
                old_file.readline()
                current_line += 1
            # 当前光标在被删除行的行首,记录该位置
            seek_point = old_file.tell()
            # 设置光标位置
            new_file.seek(seek_point, 0)
            # 读需要删除的行,光标移到下一行行首
            getline = old_file.readline()
            # 被删除行的下一行读给 next_line
            next_line = old_file.readline()
            # 连续覆盖剩余行,后面所有行上移一行
            while next_line:
                new_file.write(next_line)
                next_line = old_file.readline()
            # 写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉
            new_file.truncate()
        return (getline.strip())
     

三、图片的单张下载

我是采用h5中a标签的新属性,即a标签中的href为图片的绝对路径,增加一个download属性即为图片下载,且download值则是下载后图片的名称。(有一个不足即使兼容性不怎么好,目前仅支持谷歌浏览器以及火狐浏览器),例子如下:

 <a href="MuMu.gif" download="MuMu01.gif">
     <button  class="btn btn-success btn-xs">下载 </button> 
</a> 

四、图片的批量下载

批量下载的本质也是跟单张的一样,只不过要点击批量下载,要用js遍历模拟点击a标签实现多张下载,js如下:

$(function(){
    $('#panel_head').height('45px')
    $('input[name="checkbtn"]').each(function(){
        $(this).on('click',function(){
            chkval = []
            upsku = []
            if($("input[name='checkbtn']:checked").length 0 ){
                $('#batch_download').removeClass('hide');
            }else{
                $('#batch_download').addClass('hide')
            }
            for(var j=0;j<$("input[name='checkbtn']:checked").length;j++){

                if($("input[name='checkbtn']:checked")[j].checked){
                    chkval.push($("input[name='checkbtn']:checked")[j].value)
                    upsku.push($("input[name='checkbtn']:checked")[j].getAttribute("data-sku"))
                }
            }
        })
    })

    var btn = document.getElementById('batch_download');     

    function download(name, href) {
        var a = document.createElement("a"), //创建a标签
        e = document.createEvent("MouseEvents"); //创建鼠标事件对象
        e.initEvent("click", false, false); //初始化事件对象
        a.href = href; //设置下载地址
        a.download = name; //设置下载文件名
        a.dispatchEvent(e); //给指定的元素,执行事件click事件
    }

    //给多文件下载按钮添加点击事件
    btn.onclick = function(){
        for (var index = 0; index &lt; chkval.length; index++) {
            download(upsku[index], chkval[index]);
        }
    }

})

附加:批量文件上传处理并下载

如果想实现多文件同时上传(例如:csv、xlsx、xls等),前端的表单需要加个属性:enctype="multipart/form-data"才能实现文件多选,且选择多文件上传的时候需要按住ctrl,按住shift则是把点选当前的文件以及前面的文件全部选定,然后点击打开即可完成文件选定。前端代码如下:

{% from "macros/upload_form.html" import modal %}
<div class="row">
    <div class="col-sm-12 col-lg-12 col-md-12">
        <div class="panel panel-default card-view">
            <div class="panel-heading">
                <div class="pull-left">
                    <h6 class="panel-title txt-dark">多文件上传</h6>
                    <div class="button-list">
                        <a href="#upload_data" data-toggle="modal" title="Compose">
                            <div class="fileupload btn btn-default btn-outline btn-rounded btn-anim">
                                <i class="fa fa-upload"></i>
                                <span class="btn-text">上传待处理数据</span>
                            </div>
                        </a>
                        {{ modal(csvform, mymodal="upload_data", action='', enctype="multipart/form-data", id='upload_form', fade="modal fade", displays="display: none", title='上传待处理数据') }}
                    </div>
                </div>
                <div class="clearfix"></div>
            </div>
        </div>
    </div>
</div>

其中引用到的宏模板如下:

{# 开始表单字段 #}

{% macro modal_form_field(field) %}
  {%- if field.type != 'SubmitField' %}
    {%- if field.type == 'FileField' %}
        <div class="col-md-12 mb-20">
            {{ field(class="form-control", placeholder=field.label.text, multiple="multiple") }}
        </div>
    {% else %}
        <div class="col-md-12 mb-20">
            {{ field(class="form-control", placeholder=field.label.text) }}
        </div>
    {% endif -%}
  {% endif -%}
{% endmacro %}

{# 结束表单字段 #}



{% macro modal(form, 
                mymodal = "myModal_1",
                title = "",
                action="",
                method="post",
                role="form",
                form_type="basic",
                enctype=None,
                button_map={},
                id="",
                fade="modal fade",
                displays="display: none",
                closeWin="",
                novalidate=False) %}

{%- set _enctype = [] %}
{%- if enctype is none -%}
  {%- for field in form %}
    {%- if field.type == 'FileField' %}
      {%- set _ = _enctype.append('multipart/form-data') -%}
    {%- endif %}
  {%- endfor %}
{%- else %}
  {% set _ = _enctype.append(enctype) %}
{%- endif %}


<div aria-hidden="true" role="dialog" tabindex="-1" id="{{ mymodal }}" class="{{ fade }}" style="{{displays}}">
    <div class="modal-dialog">

    <form 
    class="form-horizontal form-material"
    {%- if action != None %} action="{{action}}"{% endif -%}
    {%- if id %} id="{{id}}"{% endif -%}
    {%- if method %} method="{{method}}"{% endif %}
    {%- if _enctype[0] %} enctype="{{_enctype[0]}}"{% endif -%}
    {%- if role %} role="{{role}}"{% endif -%}
    {%- if novalidate %} novalidate{% endif -%}
    >

        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title" id="myModalLabel">{{ title }}</h4>
            </div>
            <div class="modal-body">    
                <div class="form-group">
                    {% for field in form %}
                      {{ modal_form_field(field) }}
                    {% endfor %}
                </div>        
            </div>
            <div class="modal-footer">
                {{ form.submit(class="btn btn-info waves-effect") }}
                <button type="button" id="{{closeWin}}" class="btn btn-default waves-effect" data-dismiss="modal">取消</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </form>

    </div>
    <!-- /.modal-dialog -->
</div>
{% endmacro %}

js实现文件ajax上传如下:

$(function(){
    $('#upload_form #submit').on('click',function(e){
        e.preventDefault()
        var fileList = document.getElementById("csvfile").files;
        var fileform = new FormData(document.getElementById("upload_form"));
        fileform.append('max_num', $('#upload_form #min_num').val()) 
        fileform.append('fileList', fileList) 
        swal({   
            title: "数据上传处理中!",   
            text: "请耐心等待...",  
            showConfirmButton: false 
        });
        $.ajax({
            url:'{{ url_for("fmdata.upload_csv") }}',
            type:"POST",
            dataType:'json',
            data:fileform,
            cache: false,  
            processData: false,  
            contentType: false, 
            success:function(response){  
                    errorinfo=[]
                    for (var key in response){
                      errorinfo.push(response[key]+'\n')
                    }
                    if(response["success"]){
                        swal({   
                            title: '上传成功',   
                            type: "success",
                            timer: 1500,
                            showConfirmButton: false
                        },function(){
                            swal({   
                                title: "数据处理中!",   
                                text: "当前进度:0%",  
                                showConfirmButton: false 
                            });
                            	//定时检测文件是否处理完毕,一旦处理完就下载文件
                                var time_interval = setInterval(function(){
                                $.ajax({
                                    url : "{{url_for('fmdata.download_csv')}}",
                                    data : {
                                        'fm_id' : response["fm_id"]
                                    },
                                    dataType:'json',
                                    success : function(responses){
                                      if (responses["progress"]) {
                                        swal({   
                                          title: "数据处理中!",   
                                          text: "当前进度:" + responses["progress"] +  "%",  
                                          showConfirmButton: false 
                                      });
                                      }
                                      if(responses["download"]){
                                        clearInterval(time_interval)
                                        for (var i = responses["download"].length - 1; i >= 0; i--) {
                                          download(responses["file_name"][i], responses["download"][i])
                                        }
                                        swal({   
                                            title: '处理完成',   
                                            type: "success",
                                            timer: 1500,
                                            showConfirmButton: false
                                        })
                                    }
                                  }
                                })
                            },3500)
                        });
                        return false;
                
                    }else{
                        swal({   
                            title: "上传失败!",
                            type: "error",
                            text: errorinfo,   
                            timer: 1500,   
                            showConfirmButton: false
                        },function(){
                            window.location.reload();
                        });
                        return false;
                    }
            },  
            error:function(e){  
                swal({   
                    title: '上传失败',
                    type: "error",
                    text: "可能文件格式有误或者网络错误!!"+e,   
                    timer: 2000,   
                    showConfirmButton: false
                    },function(){
                        window.location.reload();
                    });
                    return false;
            } 
        })
    })
})

function download(name, href) {
  var a = document.createElement("a"), //创建a标签
  e = document.createEvent("MouseEvents"); //创建鼠标事件对象
  e.initEvent("click", false, false); //初始化事件对象
  a.href = href; //设置下载地址
  a.download = name; //设置下载文件名
  a.dispatchEvent(e); //给指定的元素,执行事件click事件
}

后端接收数据如下:

@fmdata.route('/upload', methods=['GET', 'POST'])
def upload_csv():
    form = CsvForm()
    if form.validate():
        # 获取前端传入的上传文件数据
        upfiles = request.files.getlist('csvfile')
        fm_id_list = []
        for file in upfiles:
            csv_path = '/app/static/fmdata/'
            uploadname = upload_file(csv_path, file, flag=False)
            new_path = os.getcwd() + csv_path + uploadname
            # 放入进程池实现异步处理
            executor = ThreadPoolExecutor(1)
            # depart_data 为处理数据的函数
            executor.submit(depart_data, new_path, uploadname)
            fm_id_list.append(fm_id)
        result = {'success': "ok"}
    else:
        result = form.errors
    return json.dumps(result)

@fmdata.route('/download_csv', methods=['GET', 'POST'])
def download_csv():
    # 处理逻辑
    #return json.dumps(result)

对于批量(单张)上传,批量(单张)下载就先介绍到这,或许某些地方总结的不够好,大神如果有什么好的建议或补充,欢迎留言。。。

Flask Web开发入门(十)之图片上传(使用Flask-Upload) 在Flask Web开发入门(八)之文件上传中,我们探讨了Flask框架下的文件上传,本章我们将使用Flask插件Flask-Uploads示例说明的图片上传与展现如何实现 开始之前,我们先简单看下Flask-Uploads源码实现: 类UploadSet: 文件上传配置集合,包含三个参数: name:文件上传配置集合的名称,默认files,一般不用修改,只是一个标识,要求数字、字母或两 阅读详情

相关推荐

如何使用Flask-Uploads来处理文件上传和下载

如果您使用 Flask-Uploads 的蓝图,可以将上传文件保存到不同的目录中,以便更好地组织应用程序的文件。例如,您可以在蓝图目录中创建一个名为 “uploads” 的目录,然后在应用程序配置中设置 UPLOADSet 为 (‘my_uploads’, ‘uploads’, ‘all’)。在这个例子中,我们将文件上传表单模板保存在 upload.html 中,并将已上传文件的模板保存在 uploaded.html 中。默认情况下,上传的文件会被保存在应用程序的静态目录中。

2301_78316786的博客 1167

flask上传图片上传文件

flask上传图片上传文件 1.导入 要获取到系统其他的文件导入os库 导入时间库 用后来的时间命名 先把第一次写的代码都放上来(我会一一讲解,后面还有完善) from datetime import datetime from flask import Flask, request, jsonify import os import random basedir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__) @ap

qq_45528961的博客 3736

Flask实现图片的上传、下载及展示

用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。 首先,实现一个简单的上传(过程中未做任何处理,只是为了演示) 点击选择图片,输入李四: HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> ...

Java知音 5万+

使用python flask框架开发图片上传接口 详细案例

python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片。 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags

大蛇王的博客 6571

Flask学习10:Flask项目集成富文本编辑器CKEditor 上传图片

CKEditor下载地址:https://ckeditor.com/ckeditor-4/download/ 访问CKeditor官方网站,进入下载页面,选择Standard Package(一般情况下功能足够用了),如果你想尝试更多的功能,可以选择下载Full Package。 下载好CKeditor之后,解压到Flask项目static/ckeditor目录即可。在Flask项目中集成CKE

喜欢海 3459

HTML + Flask实现文件上传功能

在目前的网络生活中,我们经常需要用到文件的传输,在这里,我来展示一个文件上传的demo,用以学习文件上传功能的学习。项目前端依然是原生的前端三剑客,即HTML、CSS、JavaScript。后端则利用Python的flask框架进行搭建。

qq_56447863的博客 1615

python flask 上传下载 api_Flask实现图片的上传、下载及展示示例代码

用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。首先,实现一个简单的上传(过程中未做任何处理,只是为了演示)点击选择图片,输入李四:HTML代码:Title点击提交信息后,通过 http://localhost:5000/up_photo,传递到后台对应的路由处理,查看控制台:后台接收的路由代码:basedir = os.path.abspath(os....

weixin_39929721的博客 620

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 773

flask之文件上传与下载

一、创建一个普通的文件上传的表单 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>文件上传示例</h1&...

sheqianweilong的博客 5439

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

从格雷码到多频外差:结构光相位展开实战指南(附Python仿真代码)

本文深入探讨了结构光三维测量中的相位展开技术,重点对比了格雷码和多频外差法在工业检测、逆向工程等领域的应用。通过详细的原理图解和Python仿真代码,展示了两种方法在精度、抗噪性和适用场景上的差异,为实际工程中的技术选型提供实用指南。

weixin_42535703的博客 433

Flask boostrap实现图片视频上传下载展示

Python boostrap

weixin_44986037的博客 1575

跟着团子学SAP PS:项目计划成本与项目预算设计思路

​在做SAP PS模块概览培训的时候,很多时候都会用到下面的一页PPT片子讲到项目计划成本与预算的关系,但真正这幅片子想表达的具体内容甚至大部分PS顾问也是无法阐明清楚的。 而SAP PS的设计其实是在丰富的项目管理学的基础上而开展的,所以今天从业务上结合SAP中的功能点讲一下项目成本计划及预算的逻辑。 在项目管理的十大知识领域中,项目成本管理主要是包括为使项目在批准的预算内完成而对成本进行规划...

Lucas1211的博客 3万+

python 使用flask开发API ,接收/返回 图片数据,简单案例

环境:python3 库:flask 其实从本质上来说,无论是图片还是文字或者字符,都是数据,即最原始的一串0和1组成的二进制数据,API接收或者返回图片,本质上也就是接收或返回一段数据流。 向服务器发送图片,大致步骤就是先将以二进制的方式打开,再post到服务器。 从服务器接收图片,我这边的做法是服务器端将图片转化成base64字节流形式返回,客户端收到这串字节数据,然后通过bas...

大蛇王的博客 3万+

IGBT基础知识

IGBT

u010783226的专栏 1万+

告别裸机:在FreeRTOS上为STM32移植SOEM EtherCAT主站的思路与实战

本文详细介绍了在FreeRTOS环境下为STM32移植SOEM EtherCAT主站的工程实践。通过重构任务调度模型、优化内存管理和中断响应,成功将通信周期抖动控制在±100ns以内,满足工业控制系统的严苛实时性要求。文章包含完整的移植策略、性能优化方法和实测数据,为开发者提供了一套可靠的EtherCAT主站解决方案。

weixin_30342363的博客 388

Flask 文件上传下载

Flask 文件上传下载

qq_44791003的博客 2934

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

flask 接口上传文件_Flask干货:Flask数据交换——上传文件

图 | 源网络文 | 5号程序员01事情是这样的。有一天五号程序员打算网购一盒巧克力送给自己的女朋友想必女朋友收到礼物是这样的:结果商家邮寄来的巧克力中夹着一张纸条:害!你说气不气人,现在都还没理我!这不投诉更待何时?打开投诉界面一看,咦?要求上传图片。哈~既然说起上传,那咱们就先说一下如何使用Flask上传文件。02使用Flask上传文件的简单实现Flask文件上传比较简单,主要是下面...

weixin_32394015的博客 2136

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

获取上传图片的全路径_Flask干货:Flask数据交换——上传文件

事情是这样的。有一天五号程序员打算网购一盒巧克力送给自己的女朋友想必女朋友收到礼物是这样的:结果商家邮寄来的巧克力中夹着一张纸条: 害!你说气不气人,现在都还没理我!这不投诉更待何时?打开投诉界面一看,咦?要求上传图片。哈~既然说起上传,那咱们就先说一下如何使用Flask上传文件。一、使用Flask上传文件的简单实现Flask文件上传比较简单,主要是下面3点:l 一个<form>标签被...

weixin_35904873的博客 1651

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Flask 文件上传与下载

文件上传与下载在平时开发中很常见,所以也是很重要的一部分。下面来一起看看flask中的文件上传与下载。 相关配置 # 设置文件上传保存路径 app.config['UPLOAD_FOLDER'] = 'static/upload/' # MAX_CONTENT_LENGTH设置上传文件的大小,单位字节 app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024 上传文件 定义一个视图函数,用于返回上传页面和保存上传文件。 @app.route('/upload.

小马同学 7323

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Ajax+Python flask实现上传文件功能

代码: 1. HTML <div> <input type="file" name="FileUpload" id="FileUpload"> <a class="layui-btn layui-btn-mini" id="btn_uploadimg">上传图片</a> </div> 2. Ajax实现 <script typ...

dev_zyx的博客 3817

Flask 文件上传与下载

上传页面,这里上传页面比较简陋,可以自行更改。{# enctype设置不对字符编码 #}上传效果。上传的路径设置的为项目目录下的static/upload下,上传成功后,可以看到upload文件夹下多了一张图片,名字为生成的uuid。

2401_85819863的博客 601

用Flask框架实现的单张图片上传功能 支持上传后的图片预览

这篇博客详细介绍了如何使用Flask框架实现单张图片上传功能,并支持上传后的图片预览。内容包括文件上传表单的创建、服务器端文件接收与存储、图片预览的前端实现(如使用JavaScript或Flask静态文件处理),以及安全性考虑(如文件类型验证)。通过示例代码,读者可以快速掌握图片上传与预览的核心实现方法。

StevenX5 510

js+ajax+flask实现图片异步显示,和上传保存

目录 1,参考 2,踩过的坑: 3,FormData详解 4,实现的代码如下: 1,参考 参考:(1)文件上传获取路径显示c:\fakepath\...解决办法https://blog.youkuaiyun.com/qq_29099209/article/details/82800496 (2)IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题 :https://nvry...

spider_man 2942
上一篇: MySQL数据库面试题(2020最新版)
下一篇: JS屏蔽键盘、鼠标事件
Thomas_Lean
博客等级 码龄9年 58粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值