从本地电脑获取文件路径的组件

38 篇文章 1 订阅

封装一个选取文件的组件。
我们需要的功能只是点击后选择文件,获取文件在本地电脑的绝对路径,然后我们用这个路径自己去上传。

1、结构

1、放一个el-input组件,用于显示选取的文件的路径字符串

element的el-input组件只提供了关于输入文本的功能,没有提供选择文件的功能。

  • 设置readonly属性,使它只能用于显示,而不能输入;
  • v-model绑定路径字符串

2、第一个el-button组件,是嵌套在el-input的插槽,用于点击后触发选取文件

为它绑定点击事件,添加native事件修饰符,在父组件上点击时,触发的是子组件上的事件。

@click.native="slectPath"
slectPath() {
      this.$refs.path.value = "";
      this.$refs.path.click();
    },

具有选取文件功能的元素只要type="file"的input元素。所以我们借助它来实现文件路径获取。

  • 放一个type="file"的input元素,并设置style使它不可见;
  • 为它设置一个ref,用于在vue实例中获取它;
  • 设置multiple属性,决定选取文件是是否可以多选;
  • 为它绑定一个change事件,在选取文件完成后触发。

点击第一个el-button按钮后,调用了this.$refs.path.click(),就相当于点击了这个input元素,从而会打开一个文件选取的对话框。
选取文件后,触发input的change事件

openPath() {
      let files=event.target.files;
      this.pathArr= Array.prototype.map.call(files,item=>{
         return item.path;
      })
    },

这个事件中,通过event.target.files获取所有选取的文件的路径,这是一个类数组。我们获取每一项中的path,所有的路径都放到了一个数组中;
而el-input显示的只能是字符串,所以我们在计算属性中处理一下路径数组,组成一个字符串去显示。

showPath(){
      return this.pathArr.join(',')
    }

3、第二个el-button组件,用于点击后触发上传动作

我们不希望选择完文件就直接上传,有可能选了文件暂时还不想上传。
我们为它绑定点击事件。点击后触发自定义事件,在父组件中相应,并把路径数组传过去。父组件响应事件,并且得到数据了,想干嘛干嘛,要上传也好,要展示也好,都与我子组件无关,子组件获取路径的任务已经完成了。

uploadClick() {
      if (this.pathArr.length==0) {
        this.$message.error("Please select file directory.");
        return;
      }
      this.$emit("upload",this.pathArr);
      this.pathArr=[];
    },

结构代码。

<template>
  <div class="upload-container">
    <el-input
      readonly
      size="mini"
      v-model="showPath"
      :placeholder="placeholder"
      :disabled="disabled"
    >
      <el-button
        size="mini"
        slot="append"
        icon="el-icon-folder-opened"
        @click.native="slectPath"
        :disabled="disabled"
      ></el-button>
    </el-input>
    <el-button
      size="mini"
      class="submitbtn"
      :disabled="disabled"
      @click="uploadClick"
      >{{ btnName }}</el-button
    >

    <input
      type="file"
      ref="path"
      :multiple='multiple'
      @change="openPath"
      style="
        filter: alpha(oonOpenCSVFilepacity=0);
        opacity: 0;
        width: 0px;
        height: 0px;
      "
    />
  </div>
</template>

2、css

<style scoped>
.upload-container {
  display: flex;
  align-items: center;
}
.upload-container .el-input {
  flex: 1;
}
.upload-container .submitbtn {
  margin-left: 10px;
}
</style>
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以提供一些建议来帮助你实现你要求的功能:1.使用Unity的AudioClip类来加载本地音频文件;2.使用Unity的AssetDatabase类来储存音频文件;3.使用Unity的AudioSource类来播放音频文件。 ### 回答2: 在Unity中要实现导入本地音频并储存,可以使用以下脚本: ```c# using UnityEngine; using System.IO; public class AudioImporter : MonoBehaviour { public string filePath; // 音频文件路径 private AudioSource audioSource; void Start() { audioSource = GetComponent<AudioSource>(); } // 导入音频文件 public void ImportAudio() { // 打开文件选择对话框 filePath = UnityEditor.EditorUtility.OpenFilePanel("选择音频文件", "", "wav, mp3"); // 检查文件路径是否为空 if (!string.IsNullOrEmpty(filePath)) { // 读取文件的二进制数据 byte[] audioData = File.ReadAllBytes(filePath); // 创建临时音频 AudioClip tempAudioClip = CreateAudioClip(audioData); // 将临时音频复制给AudioSource组件 audioSource.clip = tempAudioClip; Debug.Log("导入音频成功!"); } else { Debug.LogWarning("未选择音频文件!"); } } // 创建音频剪辑 private AudioClip CreateAudioClip(byte[] audioData) { // 创建临时音频剪辑 AudioClip tempAudioClip = AudioClip.Create("TempAudioClip", audioData.Length / 2, 1, 44100, false); // 设置音频数据 tempAudioClip.SetData(audioData, 0); return tempAudioClip; } } ``` 上述脚本通过`ImportAudio()`方法,打开文件选择对话框,选择要导入的音频文件。然后将文件的二进制数据读取出来,创建一个临时音频剪辑,并将剪辑赋值给AudioSource组件的clip属性,实现导入本地音频并储存。 在Unity中,将上述脚本添加到一个GameObject上,再在场景中创建一个空对象,并将AudioSource组件添加到空对象上。最后将上述脚本中的空对象拖拽到脚本的`audioSource`字段上,以获取AudioSource组件的引用。 当点击运行时,调用`ImportAudio()`方法后,选择音频文件,脚本会将文件导入并储存在AudioSource组件的clip属性中。 ### 回答3: 要实现导入本地音频并储存,在Unity中可以编写以下脚本: ```csharp using UnityEngine; using System.IO; public class AudioImporter : MonoBehaviour { public string audioFilePath; // 音频文件路径,可以在Inspector面板中设置 void Start() { if(!string.IsNullOrEmpty(audioFilePath)) { LoadAudioFromLocal(); } else { Debug.Log("音频文件路径为空,请设置正确的文件路径!"); } } void LoadAudioFromLocal() { if(File.Exists(audioFilePath)) { string audioFileName = Path.GetFileName(audioFilePath); string audioFileExtension = Path.GetExtension(audioFilePath); // 使用WWW类加载音频文件 WWW audioLoader = new WWW("file://" + audioFilePath); AudioClip audioClip = audioLoader.GetAudioClip(); // 创建音频文件夹(如果不存在) string audioFolderPath = Application.persistentDataPath + "/Audio"; if (!Directory.Exists(audioFolderPath)) { Directory.CreateDirectory(audioFolderPath); } // 保存音频文件到本地 string audioSavePath = audioFolderPath + "/" + audioFileName + audioFileExtension; File.WriteAllBytes(audioSavePath, audioLoader.bytes); Debug.Log("音频文件已保存到:" + audioSavePath); // 将音频文件加载到AudioSource组件 AudioSource audioSource = GetComponent<AudioSource>(); audioSource.clip = audioClip; } else { Debug.Log("找不到音频文件:" + audioFilePath); } } } ``` 在Unity中创建一个空物体,然后将上述脚本添加到该物体上。在Inspector面板中可以设置音频文件路径(相对于电脑的绝对路径)。当进行播放时,脚本会将音频文件从本地加载并保存到Unity项目的“/Audio”文件夹中,并将音频文件加载到AudioSource组件中进行播放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值