hhyang
hhyang
  • 发布:2023-06-20 22:49
  • 更新:2023-06-21 11:05
  • 阅读:429

云函数/云对象URL化后如何设置application/octet-stream

分类:uniCloud

如下写法不支持吗?

        const stream = fs.readFileSync(filePath)  

        return {  
            mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true  
            statusCode: 200,  
            headers: {  
                'content-type': 'application/octet-stream',  
            },  
            body: stream  
        }

错误信息

{  
    "success": false,  
    "error": {  
        "code": "InvalidComposedResponseBody",  
        "message": "The Body of ComposedResponse is not valid."  
    }  
}

那我应该如何返回zip格式的文件,让前端下载,因为一些原因无法直接放到云储存下。需要用代码对文件做一些处理。我尝试过使用base64的方法,文件过大时不太行。

2023-06-20 22:49 负责人:无 分享
已邀请:
DCloud_uniCloud_VK

DCloud_uniCloud_VK

  • hhyang (作者)

    我这个业务不是前端上传文件 然后保存云存储,是前端下载文件,云函数生成数据包zip提供给前端下载

    2023-06-21 13:57

  • DCloud_uniCloud_VK

    回复 hhyang: 云端也可以上传文件到云存储的,然后前端下载文件。这样更省流量,毕竟CDN流量比云函数流量便宜很多。

    2023-06-21 14:04

  • hhyang (作者)

    回复 DCloud_uniCloud_VK: 行 我处理下

    2023-06-21 14:08

  • DCloud_uniCloud_VK

    回复 hhyang: 然后定期删除下文件即可,现在阿里云支持目录了,你就可以定期直接删除目录即可

    2023-06-21 14:11

  • hhyang (作者)

    回复 DCloud_uniCloud_VK: 我想了下 那个阿里云的云储存没办法设置文件及目录权限,就算半个小时删除一次,也有漏洞,还是得云函数控制直接输出zip

    2023-06-21 16:17

  • hhyang (作者)

    回复 DCloud_uniCloud_VK: 另外我函数URL化之后,云函数中调用 uniCloud.uploadFile 被认为了前端调用,使劲给我报这个错:


    参数校验错误: Invalid options.filePath  
    at E (/code/index.js:20:17924)
    at uploadFile (/code/index.js:198:429643)
    at (/tmp/function/@dcloudio/serverless/lib/aliyun/uni-cloud.js:1:5384)
    at uploadPluginFile (/tmp/function/__index.js:45:31)
    at exports.main (/tmp/function/__index.js:105:24)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at Q (/tmp/function/index.js:1:23918)
    at z (/tmp/function/index.js:1:25002)
    at runUserFunction (/code/index.js:98:229649)
    at (/code/index.js:98:224815) {
    code: 'ValidationFailed'
    }

    使用


    async function uploadPluginFile(fileName,filePath){  
    const stream = fs.createReadStream(filePath)
    stream.on('close', function() {
    const removeStatus = fs.unlinkSync(filePath);
    console.log(`删除文件路径:${filePath} 状态:${removeStatus}`)
    });
    console.log(`fileName:${fileName}`)
    const result =await uniCloud.uploadFile({
    cloudPathAsRealPath:true,
    cloudPath:`/pluginCache/${fileName}`,
    fileContent: stream
    }).catch((e)=>{
    console.log(`上传错误,信息如下:`)
    console.log(e)
    })
    console.log(`上传结果如下:`)
    console.log(result)

    return result
    }

    2023-06-21 16:28

  • DCloud_uniCloud_VK

    回复 hhyang: 那你试试这样


    'use strict';  
    const fs = require("fs");
    exports.main = async (event, context) => {
    const stream = fs.readFileSync(__dirname + "/123.zip")
    // 业务逻辑结束-----------------------------------------------------------
    return {
    mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
    isBase64Encoded: true,
    statusCode: 200,
    headers: {
    'content-type': 'application/zip',
    },
    body: Buffer.from(stream).toString('base64')
    };
    };

    2023-06-21 16:45

  • hhyang (作者)

    回复 DCloud_uniCloud_VK: 你看我下面的回复DCloud_uniCloud_WYQ的,有大小限制,我的zip有2M左右,没办法相应完成,还有其他方法能完成这个业务?

    2023-06-21 16:49

  • DCloud_uniCloud_VK

    回复 hhyang: 没有了

    2023-06-21 16:51

  • hhyang (作者)

    回复 DCloud_uniCloud_VK: 那不完犊子了,另外我函数URL化之后,云函数中调用 uniCloud.uploadFile 被认为了前端调用,这个是bug还是什么有意为之?

    2023-06-21 17:01

  • DCloud_uniCloud_VK

    回复 hhyang: 应该是你写错了, url化后也可以用uniCloud.uploadFile , 在云函数中必须用await 不能用回调方式

    2023-06-21 17:05

  • DCloud_uniCloud_VK

    同时仔细看报错的行数, 到底是哪个代码问题

    2023-06-21 17:06

DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

body需要使用base64,文件过大时云函数是无法响应回来的,云厂商限制了响应体大小。

  • hhyang (作者)

            const stream = fs.readFileSync(filePath)  
    return {
    mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
    isBase64Encoded:true,
    statusCode: 200,
    headers: {
    'content-type': 'application/zip',
    },
    body: Buffer.from(stream).toString('base64')
    }

    我这样设置可以下载,但是文件最多508k,有其他方法吗?

    2023-06-21 14:01

  • DCloud_uniCloud_WYQ

    回复 hhyang: 建议大文件还是用云存储中转一下,可以客户端下载完成后通知云函数删除临时文件

    2023-06-21 17:58

要回复问题请先登录注册