测试平台系列——编写oss管理页面

Posted 自动化软件测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试平台系列——编写oss管理页面相关的知识,希望对你有一定的参考价值。

上一节我们编写好了oss相关的crud接口,那这一节我们就得为oss数据的管理编写一个新的页面了。

即将做的是一个极度精简的文件管理页面。

效果图
因为我每次都是写完一段代码,然后编写对应教程,所以效果图这种东西自然是不在话下:

图片可以点击下载,也可以删除。

编写oss下载接口

在此之前还是先搞定下之前的作业。

  • 编写随机获取文件名的方法

根据传入的文件名,配合pity的打乱顺序+当前时间戳,基本可以保证百分之90的文件名冲突问题。

  • 实现阿里云的下载文件方法

调用get_object_to_file即可,并返回新的文件路径。

  • 封装下载文件的方法
  • 编写下载文件接口
@router.get("/download")
async def download_oss_file(filepath: str):
    """
    更新oss文件,路径不能变化
    :param filepath:
    :return:
    """
    try:
        client = OssClient.get_oss_client()
        # 切割获取文件名
        filename = filepath.split("/")[-1]
        path = client.download_file(filepath, filename)
        return PityResponse.file(path, filename)
    except Exception as e:
        return PityResponse.failed(f"下载失败: e")

注意: 由于oss里面的文件名都是带路径的(目录),所以我们split一下取出文件名。

看看下载的效果
前端页面部分

前端页面表格那块自然是传统手艺,不需要多说了。

值得注意的是下面这几个地方:

  • 上传文件表单
    上传文件表单里面有个Upload组件,这个比较特殊,我们需要手动上传,我也踩了很久的坑。

这里附上源码:

这些几乎都是根据antd官网的例子来的,其中Form.Item套了2层,demo就是这么写的,我试了下去掉一个还不行。

valuePropName固定要是fileList。

上传文件的http请求

由于前端未使用axios这样的http请求库,而是umi-request(自己封装的)。

所以这边还是说明一下怎么使用:

这是文件上传的方法,第一是要制造FormData对象,并把文件数据append进去。

第二个关键就是requestType要指定为form,这2点我摸索了挺久。

下载文件

用window.open或者a标签链接到我们的download接口接口:

window.open( C O N F I G . U R L / o s s / d o w n l o a d ? f i l e p a t h = CONFIG.URL/oss/download?filepath= CONFIG.URL/oss/download?filepath=record.key)

全部代码

import PageContainer from "@ant-design/pro-layout";
import Button, Card, Col, Divider, Form, Input, Modal, Row, Table, Upload from "antd";
import InboxOutlined, PlusOutlined from "@ant-design/icons";
import CONFIG from "@/consts/config";
import useEffect, useState from "react";
import connect from 'umi';
import moment from "moment";

const Oss = (loading, dispatch, gconfig) => 

  const [form] = Form.useForm();
  const ossFileList, searchOssFileList = gconfig;
  const [visible, setVisible] = useState(false);
  const [value, setValue] = useState('');

  const onDeleteFile = key => 
    dispatch(
      type: 'gconfig/removeOssFile',
      payload: 
        filepath: key
      
    )
  

  const listFile = () => 
    dispatch(
      type: 'gconfig/listOssFile',
    )
  

  const columns = [
    
      title: '文件路径',
      key: 'key',
      dataIndex: 'key',
      render: key => <a href=`$CONFIG.URL/oss/download?filepath=$key` target="_blank">key</a>
    ,
    
      title: '大小',
      key: 'size',
      dataIndex: 'size',
      render: size => `$Math.round(size / 1024)kb`
    ,
    
      title: '更新时间',
      key: 'last_modified',
      dataIndex: 'last_modified',
      render: lastModified => moment(lastModified * 1000).subtract(moment().utcOffset() / 60 - 8, 'hours').format('YYYY-MM-DD HH:mm:ss')

    ,
    
      title: '操作',
      key: 'ops',
      render: (record) => <>
        <a onClick=() => 
          window.open(`$CONFIG.URL/oss/download?filepath=$record.key`)
        >下载</a>
        <Divider type="vertical"/>
        <a onClick=() => 
          onDeleteFile(record.key);
        >删除</a>
      </>
    ,
  ]
  const normFile = (e) => 
    if (Array.isArray(e)) 
      return e;
    
    return e && e.fileList;
  ;

  const onUpload = async () => 
    const values = await form.validateFields();
    const res = dispatch(
      type: 'gconfig/uploadFile',
      payload: values,
    )
    if (res) 
      setVisible(false)
      setValue('')
      listFile();
    
  

  useEffect(() => 
    if (value === '') 
      dispatch(
        type: 'gconfig/save',
        payload: searchOssFileList: ossFileList
      )
     else 
      dispatch(
        type: 'gconfig/save',
        payload: searchOssFileList: ossFileList.filter(v => v.key.toLowerCase().indexOf(value.toLowerCase()) > -1)
      )
    
  , [value])


  useEffect(() => 
    listFile();
  , [])


  return (
    <PageContainer title="OSS文件管理" breadcrumb=false>
      <Card>
        <Modal width=600 title="上传文件" visible=visible onCancel=() => setVisible(false) onOk=onUpload>
          <Form form=form ...CONFIG.LAYOUT>
            <Form.Item label="文件路径" name="filepath"
                       rules=[required: true, message: '请输入文件要存储的路径, 目录用/隔开']>
              <Input placeholder="请输入文件要存储的路径, 目录用/隔开"/>
            </Form.Item>
            <Form.Item label="文件" required>
              <Form.Item name="files" valuePropName="fileList" getValueFromEvent=normFile noStyle
                         rules=[required: true, message: '请至少上传一个文件']>
                <Upload.Dragger name="files" maxCount=1>
                  <p className="ant-upload-drag-icon">
                    <InboxOutlined/>
                  </p>
                  <p className="ant-upload-text">点击或拖拽文件到此区域上传

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

以上是关于测试平台系列——编写oss管理页面的主要内容,如果未能解决你的问题,请参考以下文章

测试平台系列(78) 编写Redis配置管理功能(上)

测试平台系列项目管理页面

小程序自己可以做吗?

前端直传oss需要在oss配置域名权限吗

微信小程序开发系列——4.小程序视图页面基础知识

微信小程序开发系列——4.小程序视图页面基础知识