input上传文件-vue3 -ts使用formData上传和base64上传

文章描述了在Vue应用中,如何使用`file`输入元素和AntDesignVue库实现图片上传功能,包括处理文件格式、大小限制以及调用API上传到服务器的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tempent

<AFormItem label="白色图标" name="iconWhiteUrl">
            <div class="inputBox">
              <span>上传文件
                <input
                  id="iconWhiteInp"
                  accept="image/png"
                  class="img-input"
                  type="file"
                  @change="(file)=>handleChangeIconWhiteUrl(file)"
                />
              </span>
            </div>
          <p>{{ value.iconWhiteUrl }}</p>
 </AFormItem>

ts

 import { defineComponent, reactive,ref ,nextTick} from 'vue'
 import {uploadImg} from "./addOrChange"

 const handleChangeIconWhiteUrl = async(e:any)=>{
        iconWhiteUrlList.value =[] // 自己展示的返回图片地址
        uploadImg(e,'white') //调用上传方法
        const iconWhiteInp = document.getElementById('iconWhiteInp') as HTMLInputElement | null;  //获取元素清空value
        if(iconWhiteInp){ 
          iconWhiteInp.value = ''
        }
      }

//addOrChange文件封装引入,这里是传formData的
import { reactive } from 'vue';
import { message } from 'ant-design-vue'
import api from '@/api/api'
export const addOrChangeForm = reactive({
    iconWhiteUrl:"",
})
// 上传图片传formdata对象方法
export const uploadImg = async(e:any,type:string)=>{
        const fileFormData = e.target.files[0]
        if (!uploadImgRules.type.includes(fileFormData.type)) {
          message.destroy()
          message.error('图片格式不符合要求,请重新上传png格式图片')
          return 
        }
        if (fileFormData.size  > uploadImgRules.size) {
          message.destroy()
          message.error(`图片上传超过30kb,请重新上传`)
          return 
        }
        let formData  = new FormData() //传formdata对象方法
        formData.append('file',fileFormData);
        const data = await api.hotWordIcon.uploadImgIcon(formData)
        if(data?.retcode ==0){
          if(type=='white'){
            addOrChangeForm.iconWhiteUrl = data.data
          }
          if(type=='black'){
            addOrChangeForm.iconBlackUrl = data.data
          }
        }
    
}

// 上传图片 传base64位文件流方法
export const uploadImg = async(e:any,type:string)=>{
        const fileFormData = e.target.files[0]
        
        const resultFile = e.target.files; // input 获取的文件列表
        const aBlob = new Blob([resultFile[0]],{type:'image/png'}) // 指定转换成blob的类型
        const reader = new FileReader(); // 3 新建 FileReader 对象,用于操作文件
        reader.readAsDataURL(aBlob) // 4 将文件转换成指定类型的数据
        reader.onload= async(ev:any)=>{
        const base64Url = ev.target.result; // 5 base64内容
            if (!uploadImgRules.type.includes(fileFormData.type)) {
             message.destroy()
             message.error('图片格式不符合要求,请重新上传png格式图片')
             return 
           }
           if (fileFormData.size  > uploadImgRules.size) {
             message.destroy()
             message.error(`图片上传超过30kb,请重新上传`)
             return 
           }
           const data = await api.hotWordIcon.uploadImgIcon(base64Url)
           if(data?.retcode ==0){
             if(type=='white'){
               addOrChangeForm.iconWhiteUrl = data.data
             }
             if(type=='black'){
               addOrChangeForm.iconBlackUrl = data.data
             }
           }
         }
    
}

css

    .inputBox{
      margin-top: 5px;
      span{
        padding: 6px 18px;
        background-color: #456fff;
        color: #fff;
        line-height: 10px;
        position: relative;
      }
      input{
        width: 90px;
        height: 35px;
        position: absolute;
        top: 0px;
        left: 0px;
        border: 1px solid red;
        opacity: 0;
      }
    }

好的,以下是一个基于 Vue3 TypeScript 的简单的图片上传组件封装: ```html <template> <div> <input type="file" ref="fileInput" @change="handleFileChange" /> <button @click="upload">上传</button> <img :src="imageUrl" v-if="imageUrl" /> </div> </template> <script lang="ts"> import { defineComponent, ref } from &#39;vue&#39;; export default defineComponent({ name: &#39;ImageUploader&#39;, props: { uploadUrl: { type: String, required: true, }, }, setup(props) { const fileInput = ref<HTMLInputElement | null>(null); const imageUrl = ref<string>(&#39;&#39;); const handleFileChange = () => { const file = fileInput.value?.files?.[0]; if (file) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { imageUrl.value = reader.result as string; }; } }; const upload = () => { const formData = new FormData(); formData.append(&#39;file&#39;, fileInput.value?.files?.[0] as File); fetch(props.uploadUrl, { method: &#39;POST&#39;, body: formData, }) .then((response) => response.json()) .then((data) => { console.log(data); }) .catch((error) => { console.log(error); }); }; return { fileInput, imageUrl, handleFileChange, upload, }; }, }); </script> ``` 在这个组件中,我们定义了一个 `uploadUrl` 属性来接受服务器端上传图片的 URL,然后定义了一个 `fileInput` 引用来引用 `input` 元素,再定义了一个 `imageUrl` 引用来保存上传后的图片地址。在 `handleFileChange` 方法中,我们使用 `FileReader` 对象将选择的图片读取为 base64 编码,并将编码后的字符串保存在 `imageUrl` 引用中。在 `upload` 方法中,我们创建一个 `FormData` 对象,将选择的图片放入其中,并通过 `fetch` 方法将其上传到服务器端。最后,我们将 `upload` `handleFileChange` 方法绑定到相应的按钮 `input` 元素的 `change` 事件上,以实现上传功能。 希望这个简单的示例能够帮助你封装一个图片上传组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值