DIY文件上传(修改原始input:file)

本文介绍了如何使用Vue.js创建一个可定制样式的文件上传功能,包括隐藏的`<inputtype=file>`元素,点击按钮触发上传事件,以及文件格式和大小的验证。

隐藏 input:file ,在页面创建 button 和 span 用于展示文件上传按钮和文件上传文本,在点击 button 时调用 input:file 的点击上传事件触发文件上传。

创建的 button 和 span 即可进行自定义样式

代码

<template>
  <div id="app">
    <input type="file" ref="inputfile" @change="fileChange" />
    <button @click="fileClick">选择上传文件</button>
    <span>{{ text }}</span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      text: "请选择要上传的文件",
    };
  },
  methods: {
    // button 点击触发 input:file 点击
    fileClick() {
      this.$refs.inputfile.click();
    },
    // input:file 文件上传
    fileChange(res) {
      const file = res.target.files[0];  //  获取上传文件

      const fileType = ["jpg", "png"];  // 要求文件格式
      const fileSize = 2;  // 要求文件大小

      const { name } = file;
      const nameSplit = name.split(".");  // 获取上传文件后缀名
      const suffix = nameSplit[nameSplit.length - 1].toLocaleLowerCase();
      if (!fileType.includes(suffix)) {
        alert(`文件类型应为${fileType.join("、")}`);
        return;
      }

      const { size } = file;
      const isLimitSize = size / 1024 / 1024 < fileSize;  //  判断上传文件大小
      if (!isLimitSize) {
        alert(`文件大小应小于${fileSize}M`);
        return;
      }

      this.text = file.name;
      console.log("取得上传的文件", size / 1024 / 1024, file);
    },
  },
};
</script>

<style>
input {
  display: none;
}
button {
  width: 100px;
  height: 40px;
  border-radius: 10px;
  background: pink;
}
span {
  margin-left: 20px;
  font-style: italic;
  color: red;
}
</style>

效果图

在这里插入图片描述

<think>嗯,用户问的是如何把一个WAV文件放到SPI Flash上。首先,我需要确定用户的使用场景。可能的情况有两种:一种是用户在产品开发阶段需要将音频文件烧录到SPI Flash中,比如智能设备或者嵌入式系统的音频播放功能;另一种可能是用户希望了解如何手动操作,比如DIY项目或者个人学习。 接下来,我需要考虑用户的技术背景。用户可能具备一定的嵌入式系统知识,但可能对具体的文件烧录步骤不太熟悉。因此,回答需要结构清晰,分步骤讲解,同时涉及必要的技术细节,但又不能过于复杂。 用户的需求不仅仅是知道如何传输文件,可能还关心如何在系统中访问这些文件。因此,除了烧录步骤,可能还需要说明如何在代码中读取SPI Flash中的WAV文件。另外,可能还需要提到文件格式转换、存储地址管理以及错误处理等关键点。 需要确认WAV文件的格式是否适合直接存储。WAV通常是未压缩的PCM格式,文件较大,可能需要转换格式以节省空间,比如MP3或ADPCM。但用户明确提到WAV文件,所以应该以处理WAV为主,但可以提及压缩的可能性作为优化建议。 然后,存储到SPI Flash的具体步骤。可能需要先将WAV文件转换为二进制格式,使用工具生成BIN文件,然后通过烧录工具写入到Flash的指定地址。需要解释地址对齐和分区管理,确保不会覆盖其他重要数据,比如固件或配置文件。 还要考虑烧录方式,是离线烧录还是在线烧录。用户可能没有专用编程器,所以需要提供基于常见开发工具的方法,比如使用esptool.py或者OpenOCD,通过现有的硬件接口(如USB转SPI)进行烧录。 此外,文件系统的选择也很重要。如果SPI Flash上已经有文件系统(如FAT、LittleFS等),需要说明如何将WAV文件集成进去。如果没有文件系统,可能需要直接通过地址访问,这时要强调地址管理和如何确保数据完整性。 最后,验证步骤也是关键。烧录后如何确认文件正确写入,可以通过读取校验和,或者在代码中尝试读取播放。这部分需要给出具体的示例代码或命令,帮助用户实际操作。 总结用户的潜在需求:他们可能需要在嵌入式系统中存储并播放音频文件,所以需要端到端的解决方案,从文件准备到烧录再到访问。回答需要覆盖这些方面,确保用户能够一步步实现目标,同时避免常见错误,比如地址冲突或数据损坏。</think>以下是WAV文件存入SPI Flash的标准工业实现方案及操作步骤: --- ### **一、文件预处理阶段** #### 1. 音频格式优化 - **采样率调整**:根据硬件解码能力选择: $$ f_s = \begin{cases} 8kHz & 语音类设备 \\ 16kHz & 通用嵌入式设备 \\ 44.1kHz & 高保真系统 \end{cases} $$ - **位深转换**:通常转换为16bit PCM格式 ```bash ffmpeg -i input.wav -acodec pcm_s16le -ar 16000 output.wav ``` #### 2. 二进制文件生成 - 使用Hex编辑器提取原始数据: ```c // WAV文件结构偏移量 #define DATA_OFFSET 44 // 跳过44字节头信息 FILE *fp = fopen("audio.wav", "rb"); fseek(fp, DATA_OFFSET, SEEK_SET); ``` #### 3. 地址空间规划 - 典型Flash分区示例: ```text | 起始地址 | 长度 | 内容 | |----------|---------|--------------| | 0x000000 | 256KB | Bootloader | | 0x040000 | 512KB | 应用程序 | | 0x0C0000 | 1MB | 音频存储区 | ← WAV存放位置 ``` --- ### **二、烧录实施方法** #### 方法1:离线烧录(推荐量产) **步骤1:制作烧录镜像** ```bash # 合并多文件生成完整镜像 dd if=/dev/zero of=flash.img bs=1k count=2048 # 创建2MB空镜像 dd if=bootloader.bin of=flash.img conv=notrunc dd if=audio.bin of=flash.img seek=$((0x0C0000)) conv=notrunc ``` **步骤2:编程器烧写** - 使用SPI Flash编程器写入镜像: ```python # 伪代码示例:使用PYUSB控制编程器 dev = usb.core.find(idVendor=0x0483, idProduct=0x5720) dev.write(0x01, flash_image, timeout=5000) ``` #### 方法2:在线烧录(开发调试) **步骤1:通过SWD/JTAG接口烧录** ```bash # OpenOCD命令示例 openocd -f interface/stlink.cfg -c "program audio.bin 0x0C0000 verify" ``` **步骤2:串口模式烧录(以ESP32为例)** ```bash esptool.py --port COM3 write_flash 0x0C0000 audio.bin ``` --- ### **三、嵌入式系统访问实现** #### 1. 存储驱动层 ```c // SPI Flash读取函数示例 esp_err_t read_audio_data(uint32_t addr, uint8_t *buf, size_t len) { return esp_flash_read(flash_chip, buf, addr, len); } ``` #### 2. 音频播放实现 ```c // 伪代码:PWM驱动播放 void play_wav(uint32_t start_addr) { uint32_t cursor = start_addr; while(cursor < start_addr + FILE_SIZE) { read_audio_data(cursor, pcm_buffer, BUFFER_SIZE); pwm_dac_output(pcm_buffer); cursor += BUFFER_SIZE; } } ``` --- ### **四、关键注意事项** 1. **地址对齐优化**: - 确保每次读取地址按4KB扇区对齐 - 使用DMA传输时需满足32字节对齐 2. **文件系统集成**(可选): ```c // 挂载FATFS文件系统 static FATFS fs; f_mount(&fs, "0:", 1); // '0'对应SPI Flash设备 ``` 3. **磨损均衡策略**(针对频繁更新): - 实现NAND Flash转换层(FTL) - 使用NOR Flash时建议设置只读区域 --- ### **五、验证测试流程** 1. **二进制校验**: ```bash md5sum original.bin flashed.bin ``` 2. **实时播放测试**: ```c // 信号完整性检测 if(THD+N > -60dB) { // 总谐波失真检测 log_error("Audio quality degraded"); } ``` 3. **长期稳定性测试**: ```text █ 温度循环测试:-40℃~85℃ 1000次循环 █ 持续读取测试:72小时连续播放 █ 电源扰动测试:±10%电压波动测试 ``` --- 通过上述方案可实现专业级音频数据的可靠存储与播放。建议量产时采用离线烧录+数字签名校验的组合方案,既保证效率又提升安全性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值