Flask项目上传图片的接口

1.在settings.py文件中定义好:可以允许的图片格式,上传图片保存的路径

    # 允许上传图片的格式
    ALLOWED_IMG = {'bmp', 'png', 'jpg', 'jpeg', 'gif'}
    # 保存的路径
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    SERVER_IMG_UPLOADS = os.path.join(BASE_DIR, 'flask_shop/static', 'img')

2.在项目文件下新建static/img文件夹,以用来保存图片

3.创建路由,并完成逻辑

# 上传图片的路由
@goods.route('/upload', methods=['POST'])
def upload_img():
    # 获取图片文件
    img_file = request.files.get('file')
    if not img_file:
        # 如果没有文件则返回错误
        return to_dict_msg(10000)
    # 调用方法查看是否是允许的文件格式
    if allowed_img(img_file.filename):
        # 图片的地址
        floder = current_app.config.get('SERVER_IMG_UPLOADS')
        # 图片的后缀,如jpg、gif等格式
        end_prefix = img_file.filename.split('.', 1)[1]
        # 图片的存在文件夹中的名字,这里调用了md5,以保证每个图片的名字都不一样
        file_name = md5_file()
        # 保存图片
        # 将图片的地址、名字、后缀拼接在一起
        img_file.save(f'{floder}/{file_name}.{end_prefix}')
        # 返回前端,图片的路径、图片的url
        data = {
            'path': f'static/{file_name}.{end_prefix}',
            'url': f'http://127.0.0.1:5000/static/img/{file_name}.{end_prefix}'
        }
        return to_dict_msg(200, data=data, msg='上传文件成功!')
    else:
        return to_dict_msg(10020, msg="文件格式错误!")


# 允许通过的图片格式
def allowed_img(file_name):
    # 对文件名进行分割,并查看文件名是否包含在settings中的ALLOWED_IMG里
    return '.' in file_name and file_name.split('.', 1)[1] in current_app.config['ALLOWED_IMG']


# 给文件名赋予不同的文件名
def md5_file():
    md5_obj = hashlib.md5()
    md5_obj.update(str(time()).encode())
    file_name = md5_obj.hexdigest()
    return file_name

 4.结果如下

5.此时返回的url无法被访问到一直会显示为404,在flask官网中提供了一种视图函数为已上传成功的文件提供访问服务

@goods_blue.route('/uploads/<filename>')
def download_file(filename):
    try:
        response = make_response(
            send_from_directory(current_app.config["SERVER_IMG_UPLOADS"], filename))
        return response
    except Exception as e:
        return f"文件读取异常{e}"

 这样就可以访问到了

6. 前端部分

    // 点击已经上传文件的回调
    async handlePreview(file) {
      this.imgVisible = true
      const filename = await file.response.data.path.split('/').pop()
      try {
        const result = await this.imageCode(filename)
        const blob = new Blob([result.data], { type: result.data.type })
        const imageUrl = URL.createObjectURL(blob) // 创建 URL 对象
        this.imgUrl = imageUrl // 将url配置给img标签
      } catch (error) {
        console.error('显示图片预览失败:', error)
      }
    },
    // 获取图片的接口
    async imageCode(filename) {
      try {
        const response = await axios.get(`/goods/uploads/${filename}`, { responseType: 'blob' })
        return response // 返回 Blob 对象
      } catch (error) {
        console.error('获取图片失败:', error)
        throw error
      }
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值