背景情况
在 AEM 资产 6.5 和 先前中,向服务器发送一个邮件请求,以管理资产二进制即可上传文件。 可配置更新的 AEM 版本 用于直接上传二进制,这意味着资产二进制不再直接上传到AEM. 因为这样,有一个更复杂的 上传资产二进制时遵循的算法。 此库将检查目标 AEM 实例的配置, 并视配置情况使用直接的二进制上传算法或创建资产服务器 .
提供此工具便于上传, 可以用作命令行可执行文件 或要求作为节点.js模块.

命令行
用于将资产上传到 AEM 实例的命令行工具可作为 Adobe I/O CLI 的插件 。 请 见 插件仓库 更多信息.
使用量
此库支持将文件上传到目标实例,同时为监测提供支持 转让进度、取消转让和其他特性.
安装
这个项目使用 节点 财务报告和审定财务报表 无检查他们是否在当地安装.
它可以像其他任何节点.js模块一样被安装.
$ npm install @adobe/aem-upload
要求模块
要将模块添加到您的 Node.js 项目中:
- 安装 模块.
- 需要javascript文件中的模块, 其消耗地点 :
const DirectBinary = require('@adobe/aem-upload');
上传文件
下面是上传文件到目标 AEM 实例所需的最小码量 .
const DirectBinary = require('@adobe/aem-upload');
// URL to the folder in AEM where assets will be uploaded. Folder
// must already exist.
const targetUrl = 'http://localhost:4502/content/dam/target';
// list of all local files that will be uploaded.
const uploadFiles = [
{
fileName: 'file1.jpg', // name of the file as it will appear in AEM
fileSize: 1024, // total size, in bytes, of the file
filePath: '/Users/me/Documents/my_file.jpg' // Full path to the local file
},
{
fileName: 'file2.jpg',
fileSize: 512,
filePath: '/Users/me/Documents/file2.jpg'
}
];
const upload = new DirectBinary.DirectBinaryUpload();
const options = new DirectBinary.DirectBinaryUploadOptions()
.withUrl(targetUrl)
.withUploadFiles(uploadFiles);
// this call will upload the files. The method returns a Promise, which will be resolved
// when all files have uploaded.
upload.uploadFiles(options)
.then(result => {
// "result" contains various information about the upload process, including
// performance metrics and errors that may have occurred for individual files
// at this point, assuming no errors, there will be two new assets in AEM:
// http://localhost:4502/content/dam/target/file1.jpg
// http://localhost:4502/content/dam/target/file2.jpg
})
.catch(err => {
// the Promise will reject if something causes the upload process to fail at
// a high level. Note that individual file failures will NOT trigger this
// "err" will be an instance of UploadError. See "Error Handling"
// for more information
});
支持的选项
直接二进制上传选项
这个 DirectBinaryUploadOptions 类支持以下选项.
| 选项 | 需求 | 说明 |
|---|---|---|
withUrl(<string>) | Y | 在指定文件将被上传的目标实例中, 完整、 绝对 URL 到文件夹 。 此值预计将被编码为 URI . |
withUploadFiles(<UploadFile[]>) | Y | 将上传到目标 URL 的文件列表 。 阵列中的每个项目应是一个简单的对象,其属性在 上传文件。 。 。 . |
withHttpOptions(<object>) | 无 | 消费者可以控制库在提交HTTP请求时会为获取API提供的选项. 这些选项将逐一传递给获取, 因此消费者应当引用获取 API 文档来确定哪些值是适用的 . 此外,该图书馆还使用 @ adobe/ cloud- service-客户端,所以通过一个 cloudClient 也支持该图书馆文档中描述的属性. |
withConcurrent(<boolean>) | 无 | 默认 : false如果 true,在提供的上传文件列表中的多个文件会同时传输. 若为 false,每次只传送一个文件,下一个文件直到当前文件完成后才开始传送. |
withMaxConcurrent(<number>) | 无 | 默认 : 5。任意时间允许的并行HTTP请求的最大数量。 如本报告所述 withConcurrent() 选项,库将同时上传多个文件。 此值基本上表示进程将同时上传的最大文件数量. 小于2的值将指示库 没有 要同时上传多个文件. |
withHttpRetryCount() | 无 | 默认 : 3。进程在放弃前将重试失败的 HTTP 请求的次数 。 例如,如果重试计数为3,那么如果回复显示失败,进程将最多提交3次相同的HTTP请求. |
withHttpRetryDelay() | 无 | 默认 : 5。进程等待的时间,然后重试失败的 HTTP 请求。 数值以毫秒表示。 每次重复试验后,延迟将增加其价值。 例如,如果延迟为5000,那么第一次重试将等5秒,第二次10秒,第三次15秒等. |
上传文件选项
| 财产 | 需求 | 类型 | 说明 |
|---|---|---|---|
fileName | Y | 字符串 | 文件名称将出现在 AEM 中 。 此值 没有 需要URI编码. |
fileSize | Y | 编号 | 要上传的文件的总大小, 以字节表示 . |
filePath | 无 | 字符串 | 要上传的本地文件的完整路径 。 注意,该数值之一 或者说 blob 必须指明。 此选项通常在从节点.js进程运行上传工具时最为有用. |
blob | 无 | 文件 | 文件的数据 。 此属性的唯一测试和支持值是 value hTML 语言 <input type='file' />。请注意,无论是这种财产 或者说 filePath 必须指明。 此选项在从浏览器运行上传工具时通常最有用 . |
partHeaders | 无 | 对象 | 转发的文件的每个部分将包含标题值 。 信头来自 DirectBinaryUploadOptions 仅包含在发送到 AEM 的请求中; 当发送请求到 AEM 提供的直接二进制上传 URI 时,它们会被忽略。 此选项提供了一种手段,用于指定在发送给这些URI的请求中应当包含的任何额外的信头. |
createVersion | 无 | 布尔 | 默认 : false如果 true 并且已有给定名称的资产,此进程将创建一个新版本的资产,而不是用新的二进制更新当前版本. |
versionLabel | 无 | 字符串 | 默认 : null。如果进程创建了新版本的资产,则与新创建版本相关的标签. |
versionComment | 无 | 字符串 | 默认 : null。如果进程创建了新版本的资产,则注释与新创建的版本相关. |
replace | 无 | 布尔 | 默认 : false如果 true 和已存在给定名称的资产,此进程将删除已存在的资产并创建一个同名和新二进制的新资产.请注意,如果这一选项和 createVersion 具体说明, createVersion 将优先. |
处理错误
如果文件上传失败, 进程会移动到列表中的下一个文件 。 二. 总体进程 只有当灾难发生 阻止它继续发生 上传文件。 由消费者来确定是否有个人文件上传 失败并作出相应反应.
上传过程报告的所有出错都将是 UploadError,这些是
标准日记 Error 额外实例 code 表示的数值
错误类型。 具体代码见 DirectBinary.DirectBinaryUploadErrorCodes。 。 。 .
以下是处理错误的例子,无论是在进程还是文件级别.
const codes = DirectBinary.DirectBinaryUploadErrorCodes;
const upload = new DirectBinary.DirectBinaryUpload();
upload.uploadFiles(options) // assume that options is defined previously
.then(result => {
// use this method to retrieve ALL errors during the process
const { errors = [] } = result;
errors.forEach(error => {
if (error.code === codes.ALREADY_EXISTS) {
// handle case where a file already exists
}
});
const { detailedResult = [] } = result;
// or retrieve individual file errors
detailedResult.forEach((fileResult) => {
const { result = {} } = fileResult;
const { errors = [] } = result;
errors.forEach((fileErr) => {
// content of fileErr may vary
});
});
})
.catch(err => {
if (err.code === codes.NOT_SUPPORTED) {
// handle case where direct binary access is not enabled
// on the target instance
}
});
处理个人文件错误的另一种方式是监听上传进程 活动。 。 。 .
进程执行自动 HTTP 重试处理, 即如果 HTTP 请求失败 然后进程将等待指定的间隔, 并重试相同的 HTTP 请求给定 次数。 如果请求在给定的复试次数后仍然失败,则会 使用最后一个错误将错误报告为正常。 导致重试的任何错误,在 无论是成功还是失败的情景,都将在结果中加以报告 结构.
上传事件
随着上传过程通过单个文件移动,它会随时间推移发送事件 通过文件上传的阶段。 这些事件列举如下.
| 活动 | 说明 | 数据 |
|---|---|---|
fileuploadstart | 显示一个或多个文件的上传开始. | 上传会话数据 |
fileuploadend | 显示一个或多个文件的上传完成. | 包含同样由库返回的上传结果信息的简单 Javascript 对象 upload() 方法. |
filestart | 表示文件已经开始上传 . | 文件事件数据 |
fileprogress | 表示文件已经开始上传 . | 文件进度事件数据 |
fileend | 显示文件已成功上传 。 这个活动将 没有 如果文件上传因任何原因未能成功完成,则发送. | 文件事件数据 |
fileerror | 如果文件因出错而上传失败, 则发送 。 如果文件上传成功, 此事件将不会被发送 . | 文件出错事件数据 |
foldercreated | 显示上传进程在目标中创建了新文件夹 . | 文件夹事件数据 |
上传会话数据
| 财产 | 类型 | 说明 |
|---|---|---|
uploadId | 字符串 | 一个可用于识别上传会话的独特标识符. |
fileCount | 编号 | 作为上传会话的一部分将上传的文件总数 . |
totalSize | 编号 | 作为上传会话的一部分而上传的所有文件的总大小, 以字节表示 . |
directoryCount | 编号 | 上传会话中包含的目录数量 . |
文件夹事件数据
| 财产 | 类型 | 说明 |
|---|---|---|
folderName | 字符串 | 文件夹的名称(即标题),因为它是创建的. 这个会 没有 成为URI编码值. |
targetParent | 字符串 | 创建文件夹的 AEM 文件夹的完整路径 。 这个会 没有 成为URI编码值. |
targetFolder | 字符串 | 创建的 AEM 文件夹的完整路径 。 这个会 没有 成为URI编码值. |
文件事件数据
| 财产 | 类型 | 说明 |
|---|---|---|
fileName | 字符串 | 上传选项中指定的文件名称 。 这个会 没有 成为URI编码值. |
fileSize | 编号 | 上传选项中指定的文件大小, 以字节表示 . |
targetFolder | 字符串 | 上传文件的 AEM 文件夹的完整路径 。 这个会 没有 成为URI编码值. |
targetFile | 字符串 | AEM 中资产的全部路径 。 这个会 没有 成为URI编码值. |
mimeType | 字符串 | HTTP 密码 内容 - 类型 文件的值. |
文件进度事件数据
此事件数据包括来自 文件事件数据,加上:
| 财产 | 类型 | 说明 |
|---|---|---|
transferred | 编号 | 文件上传至今的字节数 。 这将是一个累积值,每次发送事件都会增加. |
文件出错事件数据
此事件数据包括来自 文件事件数据,加上:
| 财产 | 类型 | 说明 |
|---|---|---|
errors | 错误事件数据 [] | 数组 错误事件数据 描述上传时发生的错误. |
错误事件数据
| 财产 | 类型 | 说明 |
|---|---|---|
code | 字符串 | 表示一般类型的出错。 看这个应用 常数 用于可能的值. |
message | 字符串 | 更多关于错误的描述信息 . |
innerStack | 字符串 | 当存在时,导致错误的代码堆栈. |
以下是如何处理各种事件的例子.
const upload = new DirectBinary.DirectBinaryUpload();
upload.on('filestart', data => {
const { fileName } = data;
// specific handling that should occur when a file begins uploading
});
upload.on('fileprogress', data => {
const { fileName, transferred } = data;
// specific handling that should occur as a file uploads
});
upload.on('fileend', data => {
const { fileName } = data;
// specific handling that should occur when a file finishes uploading successfully
});
upload.on('fileerror', data => {
const { fileName, errors } = data;
// specific handling that should occur when a file files to upload
});
// assume options has been declared previously
upload.uploadFiles(options);
上传本地文件
库支持上传本地文件和文件夹. 对于文件夹, 工具 将包含文件夹中的所有即时儿童文件。 它不会处理子文件夹, 除非指定“ 深上传” 选项 .
当深度上传时,库会创建目标中的文件夹结构来映射正在上传的文件夹. 新书的标题 创建的文件夹将匹配本地文件系统中存在的文件夹名称 。 目标路径可根据 路径字符限制,并取决于上传中提供的选项(参见“处理文件夹节点名称的功能”) 更多信息.
当图书馆创建新文件夹时,它就会发出 foldercreated 活动。 详情见事件文档.
以下示例说明了如何上传本地文件.
const {
FileSystemUploadOptions,
FileSystemUpload
} = require('@adobe/aem-upload');
// configure options to use basic authentication
const credentials = Buffer.from('admin:admin').toString('base64')
const options = new FileSystemUploadOptions()
.withUrl('http://localhost:4502/content/dam/target-folder')
.withHttpOptions({
headers: {
Authorization: `Basic ${credentials}`
}
});
// upload a single asset and all assets in a given folder
const fileUpload = new FileSystemUpload();
await fileUpload.upload(options, [
'/Users/me/myasset.jpg',
'/Users/me/myfolder'
]);
支持的文件选项
有一套选择, FileSystemUploadOptions,用于上传本地文件。 临Τ 默认选项,有以下选项.
| 选项 | 需求 | 说明 |
|---|---|---|
withMaxUploadFiles(<number>) | 无 | 默认值:1000. 库试图上传的文件的最大数量 。 如果目标上传超过这个数字,则进程将失败,但有例外. |
withDeepUpload(<boolean>) | 无 | 默认:虚假。 如果选中的话, 进程将包含所有要上传的后人文件夹和文件 。 如果错误, 进程将只将这些文件立即上传到文件夹内进行上传 . |
withFolderNodeNameProcessor(<function<Promise>>) | 无 | 在进行深层上传时,该工具将在AEM中创建匹配正在上传的本地文件夹的文件夹. 该工具会在为每个文件夹创建节点名称时"清理"某些字符的文件夹名. 未修改的文件夹名称会成为节点的标题. 此选项允许定制清理文件夹名的功能 。 选择应当是: function。它将得到一个单一的参数值:要清理的文件夹名称。 该函数的返回值应为: Promise,它应该用干净的文件夹名称解决.默认功能会将文件夹名称转换为小写并替换白空间和任何字符 %;#,+?^{} 和选项中指定的重置值.不论这一功能如何,图书馆将 永远 替换任意字符 ./:[] |
withAssetNodeNameProcessor(<function<Promise>>) | 无 | 当执行深上传时,该工具将在AEM中创建与正在上传的本地文件相匹配的资产. 该工具在为每个资产创建节点名时会"清理"某些字符的文件名. 此选项允许定制清理文件名的功能 。 选择应当是: function。它将得到一个单一的参数值:要清理的文件名称。 该函数的返回值应为: Promise,它应该用干净的资产名称解决.默认功能将替换任何字符 #%{}?& 和选项中指定的重置值.不论这一功能如何,图书馆将 永远 替换任意字符 ./:[] |
withInvalidCharacterReplaceValue(<string>) | 无 | 默认 : -。指定替换文件夹和资产节点名称中无效字符时使用的值。 此值用于清除文件夹/ 资产名的默认函数, 并且是 永远 替换任意字符时使用 ./:[] |
withUploadFileOptions(<UploadFileOptions>) | 无 | 指定在上传每个文件作为文件系统上传的一部分时使用的选项。 大多数 上传文件选项 无效。 例外情况是 fileName, (中文(简体) ), fileSize, (中文(简体) ), filePath,以及 blob,将被忽略. |
日志
库会通过上传项目的过程记录各种消息. 它会使用它给定的日志, 只要对象支持方法 debug(), (中文(简体) ), info(), (中文(简体) ), warn(),以及 error()。为了尽可能详细,库中还假定这些方法中的每一方法都能够接受格式化的信息: log.info('message with %s', 'formatting');。无论格式化支持如何,记录都会奏效,但格式化工作正确时会有更多信息.
为图书馆提供记录器,通过 log 选项中的元素 DirectBinaryUpload 建筑师。 以下是一个简单的例子, 可以将所有库的信息记录到 console数字 :
const upload = new DirectBinary.DirectBinaryUpload({
log: {
debug: (...theArguments) => console.log.apply(null, theArguments),
info: (...theArguments) => console.log.apply(null, theArguments),
warn: (...theArguments) => console.log.apply(null, theArguments),
error: (...theArguments) => console.log.apply(null, theArguments),
}
});
请注意,这还将与难民署合作 FileSystemUpload 建筑师.
代理支持
库利用了Fetch API,因此在浏览器中运行时,代理设置会被浏览器检测和应用. 在Node.JS中,所有HTTP请求都直接被发送到目标,而不通过代理. 自动检测系统代理设置在Node.JS中不支持,但
消费者可以使用 DirectBinaryUploadOptions.withHttpOptions() 以证明 agent 建议的数值 node-fetch。 。 。 .
特征
- 良好的调谐,以利用节点,实现最佳上传性能
- 跟踪文件传输进度
- 取消在进行中的转让
- 传输多个“ 批量” 文件
- 上传本地文件夹/文件结构
释放
此模块使用 语义释放 当发布新版本时。 合并后即启动这一进程 master 树枝。 审查语义-释放文件 承诺信息格式.
消息不符合语义发布格式的PR会 没有 生成新版本.
发布注释基于 git 承诺消息生成. 发布注释将出现在 CHANGELOG.md。 。 。 .
捐款
欢迎捐款! 读取 贡献指南 更多信息.
许可证发放
这个项目根据Apache V2许可证获得许可. 见 自由主义 更多信息.