首页 > 其他分享 >[Base64] 前端上传文件,通过 base64 传递给服务器

[Base64] 前端上传文件,通过 base64 传递给服务器

时间:2024-09-09 16:28:12浏览次数:5  
标签:文件 Base64 const data base64 file import 上传

前端

FileReader 将文件转换为 Base64 编码字符串,然后将其作为请求体发送到后端。

<input type="file" id="fileInput" />
<button onclick="uploadFileAsBase64()">上传文件</button>

<script>
  function uploadFileAsBase64() {
    const fileInput = document.getElementById("fileInput");
    const file = fileInput.files[0];

    if (file) {
      const reader = new FileReader();

      // 当文件读取完成时
      reader.onload = function (event) {
        // 获取 Base64 编码的字符串
        const base64String = event.target.result.split(",")[1]; // 去掉前面的data:URL前缀

        // 发送到后端
        fetch("/upload", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            fileName: file.name,
            fileType: file.type,
            fileData: base64String,
          }),
        })
          .then((response) => response.json())
          .then((data) => {
            console.log("上传成功:", data);
          })
          .catch((error) => {
            console.error("上传失败:", error);
          });
      };

      // 读取文件为 Data URL
      reader.readAsDataURL(file);
    } else {
      alert("请选择文件");
    }
  }
</script>

后端

需要解析接收到的 Base64 字符串并将其解码回二进制数据,以保存文件或进行其他操作。

const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.use(express.json({ limit: '10mb' })); // 增加限制以处理大文件

app.post('/upload', (req, res) => {
  const { fileName, fileType, fileData } = req.body;

  // 将 Base64 字符串解码为二进制数据
  const base64Data = fileData.replace(/^data:image\/\w+;base64,/, ''); // 对于图片,移除 MIME 类型前缀
  const buffer = Buffer.from(base64Data, 'base64');

  // 将文件保存到磁盘
  fs.writeFile(path.join(__dirname, 'uploads', fileName), buffer, (err) => {
    if (err) {
      console.error('保存文件时出错:', err);
      return res.status(500).json({ status: 'error', message: '上传失败' });
    }
    res.json({ status: 'success', message: '文件上传成功' });
  });
});

app.listen(3000, () => {
  console.log('服务器正在监听端口 3000');
});
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String uploadFile(@RequestBody FileUploadRequest request) {
        try {
            // 将 Base64 字符串解码为二进制数据
            byte[] data = Base64.getDecoder().decode(request.getFileData());
            
            // 将文件保存到磁盘
            File file = new File("./uploads/" + request.getFileName());
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(data);
            }
            return "File uploaded successfully";
        } catch (IOException e) {
            e.printStackTrace();
            return "File upload failed";
        }
    }

    static class FileUploadRequest {
        private String fileName;
        private String fileData;

        // Getters and setters
    }
}

标签:文件,Base64,const,data,base64,file,import,上传
From: https://www.cnblogs.com/Himmelbleu/p/18404780

相关文章

  • vue3+el-upload上传文件
    <template><el-uploadclass="avatar-uploader"action="#":headers="headers":http-request="uploadAction":on-change="onchange":file-list="fi......
  • Web中的文件上传漏洞(中间件)
    1.前言: 漏洞参考地址:Vulhub-Docker-Composefileforvulnerabilityenvironment2.正文:1.1IIS漏洞利用版本:IIS67iis漏洞其实就是利用了其解析特性。1.目录解析漏洞:在IIS中,如果你的文件夹带有asp等可以执行的结尾,那么此文件夹中的所有文件都会被当成asp文件进行执......
  • c# 读取上传excel转换为DataTable
    varfiles=Request.Files;if(files==null||files.Count==0){returnJson(new{code=1,msg="未获取到文件"});}varfile=files[0];vardt=ReadExcelToDataTable(file.InputStream);returnJson(new{code=1,msg="已读取Excel......
  • Spring Boot实现文件上传和下载
    1.背景项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载。2.代码工程实验目标实现简单的文件上传和下载pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.......
  • minio上传文件
    0Linux部署Minio0.1获取MinIO安装包MinIO官网:https://min.io/下载地址如下:https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm通过以下命令可直接将安装包下载至服务器wgethttps://dl.min.io/server/minio/release/linux-a......
  • selenium中解决非input标签上传文件时的一些问题
    最近在上传文件时遇到了一些问题:一、使用pyautogui①、使用pyautogui模拟在windows弹窗中输入文件路径,因系统输入法默认为中文,导致上传失败②、后来修改代码,在每次输入文件路径之前,先用热键将输入法切换为英文,然而稳定性不高importtimetry:sel......
  • 「漏洞复现」全程云OA AttachFile/UploadFile 任意文件上传漏洞
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 远程下载上传命令(绕过大小限制)
    远程下载上传命令(绕过大小限制)python起http服务python3-mhttp.server5003python2-mSimpleHTTPServer5003上传时遇到限制上传大小时:编码base64:certutil-encodeyb.exe1.txt可以把1.txt拆成三个txt,分块上传后,再使用copyc:\*txtc:\123.txt//把c盘根目录下......
  • 富文本编辑器 实现CTRL+V粘贴图片并上传、WORD粘贴带图片
    编辑器:百度ueditor前端:vue2,vue3,vue-cli,html5需求:复制粘贴word内容图片,word图片转存交互要求:开源,免费,技术支持用户体验:Ctrl+V快捷键操作该说不说,最近这块应该也是挻火的,今天早上又有网友加我微信私聊,说是想了解一下这块的技术和方案。实际我的微信号之前就已经在网上......
  • 短视频程序源码,文件上传漏洞及防御方法
    短视频程序源码,文件上传漏洞及防御方法一、文件上传漏洞原理在短视频程序源码的文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。二、文件上传漏洞触发点相......