使用节点 js SDK 或 API 在 Xero 中将附件添加到发票
Add attachments to Invoices in Xero using node js SDK or API
我正在尝试将附件添加到 xero 中的现有发票。
我正在使用 xero-node sdk (https://github.com/XeroAPI/xero-node#readme) 进行此集成,他们提供了一种添加附件的方法,如下所示:
this.xero.accountingApi.createInvoiceAttachmentByFileName(tenantId, invoiceid, filenameInvoice,includeOnline,readStream )
这里的问题是 readStream 需要 fs.ReadStream object。
我要上传的文件存在于云中,我无法在发送到 Xero 之前将其下载并存储在文件系统中。我想将天蓝色云中存在的文件直接发送到 xero。我有文件的 url,所以我可以通过发出 http 请求将内容作为变量获取,但是没有将此内容发送到 Xero 的选项。
除了 sdk 之外,还有一个 API 可用于此(此处 https://developer.xero.com/documentation/api/attachments)。但是我不确定如何将我所拥有的文件发送到 body 中的 API,因为它需要 RAW 数据。使用 body 中的文件内容调用此 API 是否需要任何特定的 headers 或编码?因为如果我只是将我从 azure 文件 url 获得的响应的 body 作为 body 传递给此 Xero 附件 API,这对我也不起作用。它尝试了很长时间并给出了超时错误。
是的,你是对的。您还需要执行其他 headers/manipulation 操作才能上传文件。
请检查示例应用程序 - 我们已将其排队以准确显示如何上传文件:https://github.com/XeroAPI/xero-node-oauth2-app/blob/master/src/app.ts#L1188
像下面这样的东西应该让你排序:
import * as fs from "fs";
const path = require("path");
const mime = require("mime-types");
const totalInvoices = await xero.accountingApi.getInvoices('your-tenantId-uuid', undefined, undefined, undefined, undefined, undefined, undefined, ['PAID']);
// Attachments need to be uploaded to associated objects https://developer.xero.com/documentation/api/attachments
// CREATE ATTACHMENT
const filename = "xero-dev.png";
const pathToUpload = path.resolve(__dirname, "../path-to-your.png");
const readStream = fs.createReadStream(pathToUpload);
const contentType = mime.lookup(filename);
const fileAttached = await xero.accountingApi.createInvoiceAttachmentByFileName(req.session.activeTenant.tenantId, totalInvoices.body.invoices[0].invoiceID, filename, true, readStream, {
headers: {
"Content-Type": contentType,
},
});
我最终将 link 添加到发票历史记录和注释部分的文件中。尽管这不是最好的解决方案,但它的目的是向客户显示发票。
感谢@SerKnight 的回答。
我正在尝试将附件添加到 xero 中的现有发票。
我正在使用 xero-node sdk (https://github.com/XeroAPI/xero-node#readme) 进行此集成,他们提供了一种添加附件的方法,如下所示:
this.xero.accountingApi.createInvoiceAttachmentByFileName(tenantId, invoiceid, filenameInvoice,includeOnline,readStream )
这里的问题是 readStream 需要 fs.ReadStream object。
我要上传的文件存在于云中,我无法在发送到 Xero 之前将其下载并存储在文件系统中。我想将天蓝色云中存在的文件直接发送到 xero。我有文件的 url,所以我可以通过发出 http 请求将内容作为变量获取,但是没有将此内容发送到 Xero 的选项。
除了 sdk 之外,还有一个 API 可用于此(此处 https://developer.xero.com/documentation/api/attachments)。但是我不确定如何将我所拥有的文件发送到 body 中的 API,因为它需要 RAW 数据。使用 body 中的文件内容调用此 API 是否需要任何特定的 headers 或编码?因为如果我只是将我从 azure 文件 url 获得的响应的 body 作为 body 传递给此 Xero 附件 API,这对我也不起作用。它尝试了很长时间并给出了超时错误。
是的,你是对的。您还需要执行其他 headers/manipulation 操作才能上传文件。
请检查示例应用程序 - 我们已将其排队以准确显示如何上传文件:https://github.com/XeroAPI/xero-node-oauth2-app/blob/master/src/app.ts#L1188
像下面这样的东西应该让你排序:
import * as fs from "fs";
const path = require("path");
const mime = require("mime-types");
const totalInvoices = await xero.accountingApi.getInvoices('your-tenantId-uuid', undefined, undefined, undefined, undefined, undefined, undefined, ['PAID']);
// Attachments need to be uploaded to associated objects https://developer.xero.com/documentation/api/attachments
// CREATE ATTACHMENT
const filename = "xero-dev.png";
const pathToUpload = path.resolve(__dirname, "../path-to-your.png");
const readStream = fs.createReadStream(pathToUpload);
const contentType = mime.lookup(filename);
const fileAttached = await xero.accountingApi.createInvoiceAttachmentByFileName(req.session.activeTenant.tenantId, totalInvoices.body.invoices[0].invoiceID, filename, true, readStream, {
headers: {
"Content-Type": contentType,
},
});
我最终将 link 添加到发票历史记录和注释部分的文件中。尽管这不是最好的解决方案,但它的目的是向客户显示发票。
感谢@SerKnight 的回答。