uniapp上传文件后缀名丢失

文章讲述了在uniapp中遇到H5录音功能不支持并导致上传文件时丢失后缀名的问题。作者决定绕过uniapp的API,使用fetch方法自定义上传功能。通过创建Blob对象,转换为File对象,并添加到FormData中,成功上传了mp3文件。对于其他类型的文件,可能需要调整MIME类型。
摘要由CSDN通过智能技术生成

写在前面: 因为uniapp不支持H5的录音,所以要靠自己去实现,这里用的是依赖库做实现,调用uni.uploadFile时发现文件后缀丢失的问题,例如我要上传一个文件名为:test.mp3,传到服务器后就变成了test.或者test,反正都把后缀名丢了,这里也去uniapp社区逛了,试下来发现都不行,官方没有提供好的解决方案。

基于这种情况,我就想干脆不用官方提供的API,自己写个上传的方1法不就行了吗?
因为uni本身就提供请求相关的api,所以不想为了一个上传再单独引入axios这样的依赖库,所以决定使用fetch

  • 先从简单的开始写一个fetch方法:
function uploadByFetch (body) {
  return fetch(`上传Url`, {
    method: 'POST',
    headers: '跟其它请求一样的请求头',
    body
  }).then((res) => res.json())
}

接下来别急着去调这个方法,先得搞清楚需要上传的文件在JS中变成了什么类型,是Buffer?Blob?FormData?还是由Blob.createObjectURL()生成的临时路径?
之所以这么问,是因为我在尝试中发现,并不是每种类型都是可以成功的,接下来说说我的答案:

  • 首先我的录音文件的一手类型是Blob,如果你碰巧和我一样,那就照着下面的方式去做即可:
const blob = new Blob()
const file = new window.File(
  [blob],
  'test.mp3', {
    type: 'audio/mpeg'
  }
)
const form = new FormData()
form.append('file', file)

最后将这个form传给上面写的fetch方法即可,如果你的文件类型不是mp3,那么可以参考:MDN Basics_of_HTTP/MIME_types

UniApp是一个基于Vue.js的跨平台开发框架,可以用于开发iOS、Android、H5等多个平台的应用程序。关于将blob文件压缩的问题,UniApp本身并没有提供专门的API或插件来进行文件压缩操作。但是你可以使用JavaScript中的一些库或者浏览器原生API来实现文件压缩。 一种常见的方法是使用HTML5中的Canvas API,将Blob文件绘制到Canvas上,然后通过调整Canvas的尺寸和质量来实现压缩。具体步骤如下: 1. 将Blob文件转换为Image对象: ```javascript const img = new Image(); img.src = URL.createObjectURL(blobFile); ``` 2. 创建一个Canvas元素,并将Image对象绘制到Canvas上: ```javascript const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); ``` 3. 调整Canvas的尺寸和质量来实现压缩: ```javascript const maxWidth = 800; // 压缩后的最大宽度 const maxHeight = 600; // 压缩后的最大高度 let width = img.width; let height = img.height; if (width > maxWidth || height > maxHeight) { if (width / height > maxWidth / maxHeight) { width = maxWidth; height = Math.round(maxWidth * (img.height / img.width)); } else { height = maxHeight; width = Math.round(maxHeight * (img.width / img.height)); } } canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); // 压缩后的Blob文件 canvas.toBlob((compressedBlob) => { // 在这里可以处理压缩后的Blob文件 }, blobFile.type, 0.8); // 最后一个参数是压缩质量,范围为0到1,1表示最高质量 ``` 这样就可以将Blob文件进行压缩。需要注意的是,压缩后的文件质量会有所损失,具体的压缩比例和质量可以根据实际需求进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值