• vue3+elementplus+flask 文件夹上传


    1. <div>
    2. <input class="fileuploadclass" title="请选择文件夹" ref="file" id="submit" type="file"
    3. multiple name="" webkitdirectory @change="folderModelOn">
    4. <el-button type="primary" @click="onUpload" style="margin-left: 10%">证书密钥上传</el-button>
    5. <ul style="margin-left: 10%; list-style-type: disc;color: #3A3A8AFF" >
    6. <li v-for="file in files_d" :key="file.name">
    7. <span> {{ file.name }}</span>
    8. </li>
    9. </ul>
    10. </div>

    input 加入这个属性webkitdirectory即可实现选择文件夹上传:

    css 

    /* 隐藏原生文件选择按钮 */
    .fileuploadclass {
      opacity: 0;
      width: 0;
      height: 0;
    }

    子组件里先选择文件夹,然后在父组件里新建完成后调用

    1. const folderModelOn = (e) => {
    2. let files = e.target.files;
    3. let formData = new FormData();
    4. for (let i = 0; i < files.length; i++) { // 每个file append到formdata里
    5. let file1 = files[i];
    6. let isor = false
    7. if (file1.name.includes('.pem')) {
    8. for (let [name, file] of formData.entries()) {
    9. if(file.name.includes(file1.name)){
    10. isor = true
    11. }
    12. }
    13. if(isor === false){
    14. formData.append('file', file1);
    15. }
    16. } else {
    17. // if (formData.size ===0){
    18. //
    19. // }
    20. // // 重置文件选择输入
    21. // document.querySelector('input[type="file"]').value = '';
    22. //
    23. // // 或者直接设置files为空数组
    24. // files = [];
    25. ElMessage({
    26. message: '上传文件必须是.pem的文件',
    27. type: 'warning',
    28. })
    29. }
    30. }
    31. formdfileata.push({formdata:formData})
    32. // 重置文件选择输入
    33. document.querySelector('input[type="file"]').value = '';
    34. for (let [name, file] of formData.entries()) {
    35. console.log(name, file);
    36. let incl = files_d.value.some((item) => item.name.includes(file.name));
    37. if(!incl){
    38. files_d.value.push({name:file.name})
    39. }
    40. }
    41. }
    1. const subData = async (row) => {
    2. console.log('提交', row)
    3. let re = JSON.parse(JSON.stringify(row))
    4. console.log('提交', employeeRow)
    5. if (re.draw_name == "新增") {
    6. await api.postshopInfos(JSON.parse(JSON.stringify(row))).then(item => {
    7. console.log(item)
    8. if (item.code === 200) {
    9. let order_id = item.data['id']
    10. console.log('获取订单id::',order_id)
    11. console.log('子组件::',proxy.$refs.drawer.formdfileata[0].formdata)
    12. ElMessage({
    13. showClose: true,
    14. message: item.msg,
    15. type: 'success',
    16. })
    17. // let formdatas = proxy.$refs.drawer.formdfileata[0].formdata
    18. // for (let [name, file] of formdatas.entries()) {
    19. // console.log(name, file);
    20. //
    21. // }
    22. let upurl = "/upload"+'?'+"shop_id="+order_id
    23. request({
    24. method: 'POST',
    25. url: upurl,
    26. data: proxy.$refs.drawer.formdfileata[0].formdata,
    27. headers: {'Content-Type': 'multipart/form-data'}
    28. }).then(function (res) {
    29. if (res.code == 200) {
    30. ElMessage({
    31. message: '文件夹上传成功',
    32. type: 'success',
    33. })
    34. }
    35. })
    36. drawer.value.isClose()
    37. } else {
    38. ElMessage.error('添加失败')
    39. }
    40. })
    41. } else {
    42. await api.putshopInfos(JSON.parse(JSON.stringify(row))).then(item => {
    43. console.log(item)
    44. if (item.code === 200) {
    45. ElMessage({
    46. showClose: true,
    47. message: item.msg,
    48. type: 'success',
    49. })
    50. drawer.value.isClose()
    51. let order_id = item.data['id']
    52. let upurl = "/upload"+'?'+"shop_id="+order_id
    53. request({
    54. method: 'POST',
    55. url: upurl,
    56. data: proxy.$refs.drawer.formdfileata[0].formdata,
    57. headers: {'Content-Type': 'multipart/form-data'}
    58. }).then(function (res) {
    59. if (res.code == 200) {
    60. ElMessage({
    61. message: '文件夹上传成功',
    62. type: 'success',
    63. })
    64. }
    65. })
    66. } else {
    67. ElMessage.error('修改失败')
    68. }
    69. })
    70. }
    71. getshopList(config)
    72. }

    flask 后端:

    1. @users_bp.route("/upload", methods=["POST"])
    2. def upload_file():
    3. print("-----------------------")
    4. if request.method == 'POST':
    5. shop_id = request.args.get('shop_id', '')
    6. BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
    7. if shop_id != "":
    8. shop_path = 'utils/cert/'+str(shop_id)
    9. dstpath = os.path.join(BASE_DIR, shop_path)
    10. if not os.path.exists(dstpath):
    11. os.makedirs(dstpath)
    12. print(f"文件夹 {dstpath} 创建成功!")
    13. else:
    14. print(f"文件夹 {dstpath} 已经存在。")
    15. ts = request.files.getlist("file")
    16. obj = ShopInfo.query.filter(ShopInfo.id==int(shop_id)).first()
    17. if len(ts)>0:
    18. for item in ts:
    19. secure_filename(item.filename)
    20. file = item.filename.split('/')[1]
    21. item.save(dstpath +'/'+ file)
    22. if 'key' in file:
    23. obj.user_account = dstpath + '/' + file
    24. db.session.commit()
    25. return jsonify({
    26. "code": "200",
    27. "data": "",
    28. "msg": "文件上传成功"
    29. })

  • 相关阅读:
    林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决
    1097 矩阵行平移(语文题,选做)
    VirtualAllocAPi逆向笔记
    Vitalik详解5种类型的ZK-EVM
    springboot基于JAVA的邮件过滤系统设计与实现
    mysql中的全文索引
    基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管
    Go学习第九章——面向“对象”编程(三大特性与接口和断言)
    Go代码包与引入:如何有效组织您的项目
    量化研究丨波动与盈利关系研究系列(一)
  • 原文地址:https://blog.csdn.net/guochunbiao0416/article/details/133742526