【问题标题】:Server-Side FileSystem Access with JavaScript使用 JavaScript 访问服务器端文件系统
【发布时间】:2019-01-23 03:02:47
【问题描述】:

我在 Amazon S3 上托管一个静态网站。在我的 Bucket 中,还存储了一些 .txt 、 .pdf 、 .svg 文件。我想用 javascript 在我的 html 网站上显示这些文件的列表(仅命名没有内容)。由于用户可以将文件上传到存储桶,因此名称总是会改变。这就是我想列出它们的原因。而且我不想列出所有文件而不是显示 html 文件,而是显示带有表格的 html 文件,该表格列出了存储桶中特定文件夹中的文件。

我不使用 nodejs,只是 js 用于浏览器。我尽量不使用任何新模块。项目应该保持简单。

我已经阅读了有关在 browserify 的帮助下在浏览器中使用诸如“fs”之类的 nodejs 模块的教程。我没有管理那个或我发现的任何其他想法。

我阅读了一些关于 FileSystemDirectoryReader for js 的内容,但目前还没有得到普遍支持。 WebKitFileSystem 会满足我的需求吗?我知道大多数文件系统 API 都使用 virtuall 目录而不是我需要的目录。

现在我想知道我是否真的需要像 npm 模块这样的东西,因为我不想访问客户端文件系统,而是我自己在 S3 上的文件系统。 我已经使用 XMLHttpRequest 从这些文件中读取了数据,但我也可以只列出名称吗?

如果我有一些类似的代码,那就太好了: var arrFiles = []; arrFiles = readFiles("./files/*");

另一种方法是使用 AWS Lambda 读取所有文件名,将它们保存为文本文件中的列表,然后使用 js 读取该文件以在网站上打印名称。看起来很复杂。

如果这有任何意义。 提前致谢

【问题讨论】:

  • 浏览器不能在没有服务器帮助的情况下访问服务器的文件系统,你肯定需要一些服务器端代码。
  • 好的,谢谢:)。但是为什么我可以读取这些文件的内容而不是所有文件的名称?
  • @TamDo - 因为它们是根本不同的东西,具有不同的安全含义,一个在浏览器中被允许,另一个则不是。您也许可以将您的 S3 网站配置为具有“索引”页面(Web 服务器的相当标准的功能,但 S3 是一个不同的野兽)。如果可以,那么您可以从基于浏览器的 JavaScript 代码中查询和解析该页面。但是我不知道 S3 网站托管,所以我不知道这是否可能。
  • 好吧,我没想到。感谢您的回答。我将尝试 aws lambda 解决方案。
  • 它看起来像you can configure an index document,但由于它会在有人访问您网站的根目录时显示,所以您可能不想走那条路。 Lambda 或者坦率地说只是一个手动维护的文件听起来是你最好的选择。

标签: javascript amazon-web-services amazon-s3 xmlhttprequest filesystems


【解决方案1】:

我现在使用 lambda 函数生成表格内容。

在那个 lambda 函数中,我使用 aws.s3 类和 listObjectsV2()。它读取特定文件夹中的所有数据。我将所有找到的文件的名称写入存储在存储桶中的文本文件。

每次重新加载页面时,该 js 文件都会使用 XMLHttp 请求来读取该文本文件。所以它会获取存储桶文件夹的内容,并可以将名称写入表中。当我返回显示表格的网站主页时,总是会触发 lambda 函数。

【讨论】:

    【解决方案2】:

    使用 AWS AWS Mobile CLIaws-amplify 是可能的。它们是很棒的文档和示例site

    基本上,您创建一个 aws 移动中心,配置您的 S3 存储桶、cognito、dynamodb 和您需要的任何其他 aws 服务。

    首先用 node js 安装 AWS 移动 cli

    npm install -g awsmobile-cli
    

    配置它。

    awsmobile configure
    

    初始化你的项目

    awsmobile init
    

    在您的项目中安装 aws-amplify 节点包一次

    npm i install aws-amplify
    

    导入必要的模块并进行配置。

    import Amplify, { Storage } from 'aws-amplify';
    import aws_exports from './aws-exports';
    Amplify.configure(aws_exports);
    

    最后只需调用List 函数,它会列出指定路径下的键。

    Storage.list('photos/')
           .then(result => console.log(result))
           .catch(err => console.log(err));
    

    您可以执行各种功能,例如上传、下载和删除。它们由 AWS 团队维护和支持,不仅限于 S3。

    它们与 Angular 和 react js 都兼容。

    【讨论】:

    • 感谢您的回答。我没有使用 nodejs、Angular 或 react。所以我想我会坚持使用简单的 AWS Lambda AWS.S3 类,我发现它支持 listObjectsV2 方法。
    • 您可以将其与带有脚本标签的传统 javascript 一起使用,而无需 angular 或 react js 但 Lamdba 方式更容易。祝你好运,编码愉快
    猜你喜欢
    • 2017-09-06
    • 2022-06-11
    • 1970-01-01
    • 2013-12-01
    • 2014-06-05
    • 1970-01-01
    • 2013-06-03
    • 2013-10-01
    • 2011-06-19
    相关资源
    最近更新 更多