Javascript : store an image in the browser, 然后在 Markdown 中使用它

标签 javascript image typescript markdown

我正在实现一个 markdown 编辑器,它接受语法为

的图像
![any text](http url)

虽然我使用这种语法是因为它在我的情况下更简单(但语法并不真正相关,也不起作用)

![ID]
...
[ID]: url ("Image title")

当我给图片一个 URL 时效果很好,但我要做的是将图片存储在浏览器中并显示它,然后如果用户发布他的内容,应上传图片

这似乎是节省服务器空间的最佳选择,但我不知道是否可行。

我试过使用 base64 图像,但 URL 非常大,它会导致解析器失败。

我愿意接受任何处理这个问题的建议,或者如果你知道如何做我想做的,请随时向我解释!

到目前为止,我测试的代码:

fileChange(event: Event) {
  const files = (event.target as HTMLInputElement).files;

  if (!files || !files.length) { return; }

  for (let i = 0; i < files.length; i++) {
    const file = files.item(i);
    const fileType = file.name.split('.').slice(-1).toString();
    if (/* wrong extension */) { continue; }
    if (/* wrong size */) { continue; }
    this.createMediaUrl(file);
  }
}

createMediaUrl(file: File) {

  const media: { file: File, id: string, url: string, name: string } = {} as any;

  const FR = new FileReader();
  FR.onload = () => media.url = FR.result;
  FR.readAsDataURL(file);
  media.name = file.name;
  media.id = Math.random().toString(36).slice(-6);
  media.file = file;
  this.medias.push(media);
  console.log(media);
}

我应该声明我在 Typescript 工作,但这是一个 Javascript 问题(至少对我而言)。

除了这个问题,我在任何其他事情上都不需要帮助:我发布的代码是一个简化的代码,我的所有检查都很好等等。我唯一的问题是 Markdown 。

提前致谢!

最佳答案

这种情况正是为什么 URL.createObjectURL()被添加到规范中。 Base64 编码的字符串在达到各种 API 的大小和/或内存限制时可能会导致问题,因此可以访问 blob 的短临时本地 URI 字符串。可以很方便,碰巧的是,这正是您所需要的:

createMediaUrl(file: File) {
  const media: { file: File, id: string, url: string, name: string } = {} as any;

  media.url = URL.createObjectURL(file);
  media.name = file.name;
  media.id = Math.random().toString(36).slice(-6);
  media.file = file;
  this.medias.push(media);
  console.log(media);
}

参见 supporting browsers .

(感谢 @T.J.Crowder 提供链接)

关于Javascript : store an image in the browser, 然后在 Markdown 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633332/

相关文章:

angular - 如何将异步服务用于 Angular httpClient 拦截器

angular - 在另一个 API 调用中显示来自 API 调用的数据

javascript - Electron:ES模块的require()

javascript - 什么时候不在 html/css/javascript 的命名约定中使用连字符?

javascript - 如何在嵌套 promise 中传播resolve()?

javascript - 如何使用knex无条件删除表中的所有记录?

css - 获取图像以拉伸(stretch) div

javascript - 选择相同宽度的选项

javascript - 图像上传部分中的跨浏览器图像预览在 ie8 中不起作用

Swift 中的 iOS 图像查看器,以编程方式