Holibut 2025-09-09 17:29 采纳率: 33.3%
浏览 7
已结题

motia API step 下载文件内容不对

下面的motia(https://www.motia.dev/) API step 代码,用于下载指定PDF文件,目前,下载后的文件内容不对,部份如下:
{"type":"Buffer","data":[37,80,68,70,45,49,46,53,10,37,181,237,174,251,10,52,32,48,32,111,98,106,10,60,60,32,47,76,101,110,103,116,104,32,53,32,48,32,82,10,32,32,32,47,70,105,108,116,101,114,32,47,70,108,97,116,101,68,101,99,111,100,101,10,62,62,10,115,116,114,101,97,109,10,120,156,204,189,205,174,244,204,146,157,55,239,171,248,1
请解决。

下面是相应的代码:

const { z } = require('zod');
import fs from 'fs';
import path from 'path';

// 导入dotenv模块
require('dotenv').config();

// Basic app starter - JavaScript API endpoint
exports.config = {
  type: 'api',
  name: 'downloadFile',
  description: 'Download file',

  method: 'GET',
  path: '/api/service/image',

  emits: [],
  flows: [],
};

exports.handler = async (req, { logger, emit, traceId, streams }) => {

  try {
    // 处理预检请求
    if (req.method === 'OPTIONS') {
      return {
        status: 200,
        body: {
        }
      };
    }

    const { path: imagePath } = req.queryParams;

    logger.info('🚀 Starting basic app', { imagePath, traceId });

    if (!imagePath) {
      return {
        status: 400,
        body: {
          message: '缺少图片路径参数!',
        }
      };
    }
    const fullPath = process.env.R_FILE_PREFIX + imagePath 
    // 验证文件是否存在
    if (!fs.existsSync(fullPath)) {

      return {
        status: 404,
        body: {
          message: '图片文件不存在!',
        }
      };

    }


    // 获取文件信息
    const stats = fs.statSync(fullPath);
    // 创建可读流
    // const fileStream = fs.createReadStream(fullPath);

    const buffer = fs.readFileSync(fullPath);

    // 根据扩展名确定内容类型
    const ext = path.extname(fullPath).toLowerCase();
    const contentType = getContentType(ext);
    logger.info('download file successfully', { fullPath });

    return {
      status: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type, Content-Length, Authorization',
        // 'Content-Type': 'application/octet-stream', // contentType,
        'Content-Type':contentType,
        'Content-Disposition': `attachment; filename="${path.basename(fullPath)}"`,
        'Content-Length': stats.size.toString(),
        'Cache-Control': 'no-cache'
      },
      body: buffer
      // body: fs.createReadStream(fullPath)
    }

  } catch (e) {
    console.log('e: ', e)
  }
};

// 获取内容类型
function getContentType(ext) {
  const types = {
    '.pdf': 'application/pdf',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg',
    '.gif': 'image/gif',
    '.svg': 'image/svg+xml',
    '.webp': 'image/webp'
  };

  return types[ext] || 'image/jpeg';
}



/* test

curl -OJ "http://localhost:3301/api/service/image?path=tasks/20250708064412/figure/MGCK2501-009_MGCK2504-007.snp.pdf"

http://localhost:3301/api/service/image?path=tasks%2F20250708064412%2Ffigure%2FMGCK2501-009_MGCK2504-007.snp.pdf
curl -OJ "http://localhost:3301/api/service/image?path=tasks/20250708064412/figure/MGCK2501-009_MGCK2504-007.snp.pdf"

*/




  • 写回答

5条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-09-09 17:30
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 从问题描述来看,使用motia API step下载PDF文件后内容不正确,出现了类似{“type”:”Buffer”,”data”:这样的部分,说明文件在传输或解析过程中出现了错误。
      - 可能原因包括网络请求问题、API返回数据格式与预期不符、文件内容在传输中被损坏等。
    2. 解决方案:
      - 检查网络请求
      • 确保在使用API进行下载时,网络连接稳定且没有中断。可以使用浏览器开发者工具(如Chrome的开发者工具)来检查网络请求是否成功,状态码是否正常(例如200表示成功)。
      • 示例代码(假设使用JavaScript的fetch API):
    fetch('https://www.motia.dev/api/your-download-endpoint?file=your-pdf-file.pdf')
     .then(response => {
        if (!response.ok) {
          throw new Error('Network response was not ok');
        }
        return response.blob();
      })
     .then(blob => {
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'your-pdf-file.pdf';
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
      })
     .catch(error => {
        console.error('Error:', error);
      });
    
    • 检查API返回数据格式
      • 仔细查看motia API文档,确认其返回的文件数据格式是否正确。可能需要调整代码来正确处理返回的数据。例如,如果API返回的是JSON格式的数据,包含文件的二进制内容(如{“type”:”Buffer”,”data”:后面跟着的内容),需要进行相应的解析。
      • 假设API返回的数据格式是一个包含文件二进制数据的JSON对象:
    fetch('https://www.motia.dev/api/your-download-endpoint?file=your-pdf-file.pdf')
     .then(response => response.json())
     .then(data => {
        const buffer = Buffer.from(data.data, 'base64');
        const blob = new Blob([buffer], { type: 'application/pdf' });
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'your-pdf-file.pdf';
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
      })
     .catch(error => {
        console.error('Error:', error);
      });
    
    1. 多种解决方案的优缺点:
      - 基于fetch API的直接下载
      • 优点:简单直接,符合现代的网络请求规范,易于理解和维护。
      • 缺点:对于复杂的文件格式处理可能不够灵活,例如如果API返回的数据格式不是标准的Blob格式,可能需要额外的解析步骤。
      • 解析API返回的JSON数据
      • 优点:能够更灵活地处理各种可能的API返回数据格式,尤其是当数据格式不直接是文件内容时。
      • 缺点:增加了代码的复杂性,需要正确解析JSON数据并处理可能的错误情况。
    2. 总结:
      - 首先要检查网络请求是否正常,确保能够正确获取到API返回的数据。然后根据API返回的数据格式,调整代码来正确处理文件内容。如果是简单的Blob格式返回,可以直接下载;如果是复杂格式(如包含在JSON中的二进制数据),则需要进行相应的解析和转换,最终将数据转换为可下载的PDF文件。

    请注意,以上代码中的URL和参数需要根据实际的motia API进行调整。同时,确保你有使用motia API的合法权限。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日
  • 创建了问题 9月9日