小程序接收respose中的数组

前端如果是小程序需要怎么处理

我们假设小程序是微信小程序,那么需要使用小程序的API来发送请求和下载文件。

微信小程序中,发送请求使用wx.request,但是wx.request不支持直接下载文件到本地(它接收到的数据是文本或ArrayBuffer,但不会直接保存为文件)。

对于下载文件,微信小程序提供了wx.downloadFile API,但是wx.downloadFile只支持GET请求,而你的需求是POST请求。

因此,我们需要将POST请求转化为GET请求,或者使用其他方法。

但是,你的后端接口是POST,并且传递JSON参数,所以不能直接使用wx.downloadFile。

另一种方案是:使用wx.request请求,将返回的二进制数据保存为文件。但是,wx.request返回的数据可以是ArrayBuffer,然后我们可以使用wx.getFileSystemManager()将ArrayBuffer写入本地文件。

步骤:

  1. 使用wx.request,设置responseType为'arraybuffer',这样返回的数据是ArrayBuffer。

  2. 将ArrayBuffer写入本地文件。

但是,注意:微信小程序的文件系统是沙盒环境,只能保存到临时文件或缓存文件,然后可以调用wx.saveFile保存到本地。

然而,对于用户来说,他们可能希望直接下载到手机存储中,并且可以方便地找到。微信小程序提供了wx.saveFile,但保存的文件路径是在小程序沙盒内,用户无法直接访问。因此,更好的做法是让用户选择保存路径,但微信小程序没有提供这样的API。

但是,我们可以将文件保存到临时文件,然后使用wx.openDocument打开文件(如果是Excel,需要先保存为临时文件,然后调用wx.openDocument)。但是,微信小程序的wx.openDocument支持打开的文件类型有限,包括:doc, xls, ppt, pdf, docx, xlsx, pptx。

所以,我们可以这样做:

  1. 发送POST请求,获取Excel文件的二进制数据(ArrayBuffer)。

  2. 将ArrayBuffer写入临时文件(使用微信小程序的文件系统)。

  3. 使用wx.openDocument打开该临时文件,这样用户就可以看到文件内容,并且可以选择另存为。

但是,注意:微信小程序打开文档需要用户授权,并且临时文件在本次会话结束后可能被清理。

另外,由于小程序对文件大小有限制,如果文件过大,可能会导致问题。

具体代码实现:

第一步:发送POST请求,获取ArrayBuffer

第二步:将ArrayBuffer写入临时文件

第三步:打开文档

由于小程序环境限制,我们不能直接使用浏览器中的Blob和URL.createObjectURL,所以需要换一种方式。

下面是一个示例代码:

注意:需要在app.json中配置requiredBackgroundModes和权限,例如:

{

"requiredBackgroundModes": ["downloadFile"],

"permission": {

"scope.writePhotosAlbum": {

"desc": "需要写入相册权限"

}

}

}

但是,实际上我们并不需要写入相册,而是需要写入文件并打开。所以,我们需要在代码中请求写入文件的权限。

由于微信小程序的文件系统API不需要用户授权,所以我们可以直接写入临时文件。

以下是具体步骤:

  1. 使用wx.request发送POST请求,注意设置responseType为'arraybuffer'。

  2. 将返回的ArrayBuffer写入临时文件路径(可以使用wx.env.USER_DATA_PATH,这是一个用户文件目录,可以持久保存)。

  3. 使用wx.openDocument打开文件。

但是,注意:wx.openDocument在微信小程序基础库2.14.0之后支持打开xlsx文件,但需要用户安装相应的办公软件(如WPS、微软Office等)才能打开。

代码示例:

由于小程序代码包限制,我们只能在小程序页面中编写以下代码。

小程序处理Excel文件下载的完整方案

小程序不能直接像浏览器那样使用<a>标签下载文件,需要使用小程序特有的API。以下是完整的解决方案:

方案1:使用wx.downloadFile API(推荐)

这是小程序最标准的文件下载方式:

javascript

复制代码
// 在小程序页面的js文件中
Page({
  data: {
    loading: false,
    downloadProgress: 0,
    filePath: ''
  },

  // 下载Excel文件
  downloadExcel() {
    const that = this
    const url = 'http://x8c87c69.natappfree.cc/business/announcementApply/export'
    
    // 显示加载状态
    wx.showLoading({
      title: '正在生成文件...',
      mask: true
    })
    
    // 小程序请求需要将URL添加到合法域名
    // 或者在开发环境中勾选"不校验合法域名"
    wx.request({
      url: url,
      method: 'POST',
      header: {
        'content-type': 'application/json'
      },
      data: {
        announcementId: 4,
        applicationStatus: 1
      },
      responseType: 'arraybuffer', // 重要:设置为arraybuffer接收二进制数据
      success(res) {
        if (res.statusCode === 200) {
          // 1. 将arraybuffer保存为临时文件
          const fs = wx.getFileSystemManager()
          const filePath = wx.env.USER_DATA_PATH + '/announcement_apply.xlsx'
          
          // 写入临时文件
          fs.writeFile({
            filePath: filePath,
            data: res.data,
            encoding: 'binary',
            success() {
              wx.hideLoading()
              
              // 2. 使用wx.openDocument打开文件
              wx.openDocument({
                filePath: filePath,
                fileType: 'xlsx',
                success() {
                  console.log('打开文档成功')
                  
                  // 3. 可选:询问用户是否保存到手机
                  wx.showModal({
                    title: '保存文件',
                    content: '是否保存Excel文件到手机?',
                    success(res) {
                      if (res.confirm) {
                        that.saveFileToAlbum(filePath)
                      }
                    }
                  })
                },
                fail(err) {
                  console.error('打开文档失败:', err)
                  wx.showToast({
                    title: '无法打开文件',
                    icon: 'none'
                  })
                }
              })
            },
            fail(err) {
              wx.hideLoading()
              console.error('写入文件失败:', err)
              wx.showToast({
                title: '保存文件失败',
                icon: 'none'
              })
            }
          })
        } else {
          wx.hideLoading()
          wx.showToast({
            title: '请求失败: ' + res.statusCode,
            icon: 'none'
          })
        }
      },
      fail(err) {
        wx.hideLoading()
        console.error('请求失败:', err)
        wx.showToast({
          title: '网络请求失败',
          icon: 'none'
        })
      }
    })
  },

  // 保存文件到相册(需要用户授权)
  saveFileToAlbum(filePath) {
    wx.saveFile({
      tempFilePath: filePath,
      success(res) {
        const savedFilePath = res.savedFilePath
        wx.showToast({
          title: '保存成功',
          icon: 'success'
        })
      },
      fail(err) {
        console.error('保存文件失败:', err)
        wx.showToast({
          title: '保存失败',
          icon: 'none'
        })
      }
    })
  }
})

方案2:使用wx.downloadFile + wx.openDocument

如果后端返回的是文件下载链接,可以使用这种方式:

相关推荐
晚霞的不甘2 小时前
Flutter for OpenHarmony 电商 App 搜索功能深度解析:从点击到反馈的完整实现
开发语言·前端·javascript·flutter·前端框架
Dragon Wu2 小时前
React Native MMKV完整封装
前端·javascript·react native·react.js
说私域2 小时前
分享经济视角下社会化众包与众筹的创新路径——链动2+1模式AI智能名片小程序的融合应用
人工智能·小程序·流量运营·私域运营
前端(从入门到入土)2 小时前
解决Webpack打包白屏报错问题l.a.browse is not a function
前端·javascript
Jul1en_2 小时前
【Web自动化测试】Selenium常用函数+IDEA断言配置
前端·selenium·intellij-idea
Marshmallowc2 小时前
从源码深度解析 React:Hook 如何在 Fiber 中存储?DOM Ref 如何绑定?
前端·react.js·前端框架·fiber
Eiceblue2 小时前
Vue文档编辑器(Word默认功能)示例
前端·vue.js·word
谷哥的小弟2 小时前
图片上传自动人脸打码:微信小程序隐私保护实践
微信小程序·人脸识别·图片上传·马赛克·隐私保护·自动打码
Mr Xu_2 小时前
在 Vue 3 中集成 WangEditor 富文本编辑器:从基础到实战
前端·javascript·vue.js