前端如果是小程序需要怎么处理
我们假设小程序是微信小程序,那么需要使用小程序的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写入本地文件。
步骤:
-
使用wx.request,设置responseType为'arraybuffer',这样返回的数据是ArrayBuffer。
-
将ArrayBuffer写入本地文件。
但是,注意:微信小程序的文件系统是沙盒环境,只能保存到临时文件或缓存文件,然后可以调用wx.saveFile保存到本地。
然而,对于用户来说,他们可能希望直接下载到手机存储中,并且可以方便地找到。微信小程序提供了wx.saveFile,但保存的文件路径是在小程序沙盒内,用户无法直接访问。因此,更好的做法是让用户选择保存路径,但微信小程序没有提供这样的API。
但是,我们可以将文件保存到临时文件,然后使用wx.openDocument打开文件(如果是Excel,需要先保存为临时文件,然后调用wx.openDocument)。但是,微信小程序的wx.openDocument支持打开的文件类型有限,包括:doc, xls, ppt, pdf, docx, xlsx, pptx。
所以,我们可以这样做:
-
发送POST请求,获取Excel文件的二进制数据(ArrayBuffer)。
-
将ArrayBuffer写入临时文件(使用微信小程序的文件系统)。
-
使用wx.openDocument打开该临时文件,这样用户就可以看到文件内容,并且可以选择另存为。
但是,注意:微信小程序打开文档需要用户授权,并且临时文件在本次会话结束后可能被清理。
另外,由于小程序对文件大小有限制,如果文件过大,可能会导致问题。
具体代码实现:
第一步:发送POST请求,获取ArrayBuffer
第二步:将ArrayBuffer写入临时文件
第三步:打开文档
由于小程序环境限制,我们不能直接使用浏览器中的Blob和URL.createObjectURL,所以需要换一种方式。
下面是一个示例代码:
注意:需要在app.json中配置requiredBackgroundModes和权限,例如:
{
"requiredBackgroundModes": ["downloadFile"],
"permission": {
"scope.writePhotosAlbum": {
"desc": "需要写入相册权限"
}
}
}
但是,实际上我们并不需要写入相册,而是需要写入文件并打开。所以,我们需要在代码中请求写入文件的权限。
由于微信小程序的文件系统API不需要用户授权,所以我们可以直接写入临时文件。
以下是具体步骤:
-
使用wx.request发送POST请求,注意设置responseType为'arraybuffer'。
-
将返回的ArrayBuffer写入临时文件路径(可以使用wx.env.USER_DATA_PATH,这是一个用户文件目录,可以持久保存)。
-
使用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
如果后端返回的是文件下载链接,可以使用这种方式: