bounty将在6天后过期。回答此问题可获得+200声望奖励。Tenders McChiken希望奖励现有答案。
请注意,这是一个自我回答的问题。
这个问题是关于ToastUI图像编辑器v3.3.0的,但它也可能适用于较新的版本。
当您使用以下官方示例加载图像时:
// Create image editor
var imageEditor = new tui.component.ImageEditor('#my-image-editor canvas', {
cssMaxWidth: 1000, // Component default value: 1000
cssMaxHeight: 800 // Component default value: 800
});
// Load image
imageEditor.loadImageFromURL('img/sampleImage.jpg', 'My sample image')
编辑器不会加载图像。函数既不抛出也不返回任何指示失败的信息,你也不会得到任何错误信息。它返回一个承诺,按照文档中的指定进行解析。
它只能通过在初始配置中指定映像来加载映像,之后您无法更改它:
// Create image editor
var imageEditor = new tui.component.ImageEditor('#my-image-editor canvas', {
includeUI: {
loadImage: {
path: 'img/sampleImage.jpg',
name: 'My sample image'
},
},
cssMaxWidth: 1000, // Component default value: 1000
cssMaxHeight: 800 // Component default value: 800
});
似乎loadImageFromURL函数已损坏,根据其他用户的说法,loadImageFromFile
也存在相同的问题。
这个问题在GitHub上已经被提出了,但是基本上被忽略了。现在已经一个月了,不幸的是它仍然没有被修复。
所以问题是,在这个问题存在的情况下,如何才能欺骗图像编辑器工作。
这里有一个小提琴表明它不工作:https://fiddle.sencha.com/#view/editor&fiddle/2org
3条答案
按热度按时间plupiseo1#
靶病变; DR:
Here is a working fiddle: https://fiddle.sencha.com/#view/editor&fiddle/2p0o
详细版本:
存在四个问题:
loadImageFromURL
之前,需要等待图像编辑器对象准备就绪,否则可能会出现错误或静默失败Access-Control-Allow-Origin
标头并显式允许您的域访问它,否则图像编辑器无法访问它。第一个问题可以通过加载一个空白图像来解决,如下所示:
第二个问题可以通过等待图像编辑器使用未公开的功能脱离锁定状态来解决。您可以在运行时为
loadImageFromURL
打补丁,如下所示:第三个问题可以这样解决:取
loadImageFromURL
返回的promise解析的对象,并将新的和旧的width/height属性传递给ui.resizeEditor
函数,如下所示:第四个问题可能有点混乱。让我来解释一下。在网站上,你可以使用
<img>
标签包含几乎任何你想要的外部图像,但是如果你想使用JavaScript访问外部图像,提供图像的服务器必须明确允许你使用access-control-allow-origin
头文件来访问。例如,在Amazon S3上,默认情况下服务器不允许这样做。您必须手动设置服务器以允许您的域或任何域访问它。请参阅here。如果您使用的是其他服务器,例如,你可以像wikipedia对this image所做的那样,将access-control-allow-origin
设置为*
,然后你(和图像编辑器)可以从任何域的JavaScript访问该图像。pwuypxnk2#
对于那些正在使用Rails的人,当谈到@Forivin所陈述的第四个问题时,这就是我为使它工作所做的。
问题是当吐司调用存储在S3上的图像时,我会在Chrome上得到一个CORS错误,但Firefox没有问题。有很多关于这个问题的文章,基本上我发现最好的方法是在我的代码中使用代理。我仍然可以让我的CORS原点指向我的主机,由于调用是通过代理从我的主机发出的,S3和Chrome很高兴,我的S3 CORS配置看起来是这样的(允许子域):
在您的Rails项目中执行以下操作:
在
Gemfile
中添加机架代理gem创建一个代理文件。s3路径是URI编码的,并附加到路由的末尾。该路由只用于代理,所以它可以是任何东西,因为它将被重新路由到s3。
app/proxy/s3_proxy.rb
添加到
application.rb
文件:routes.rb
my_controller.rb
中的控制器方法。在这里呈现什么并不重要,因为它将被代理重定向。我们可能不使用任何方法,因为代理无论如何都会更改。最后,在我的Vue代码中,我调用吐司编辑器,首先填充一个空白的白色图像。然后,当组件被挂载时,我加载s3图像,覆盖现有图像并调整画布的大小。我发现在阅读s3图像之前,我需要稍微延迟一点。s3图像是一个预先签名的url,我在props中传递它。
2j4z5cfb3#
在打开要编辑的图像标签之前,将此属性添加到该标签:
As explained here: https://github.com/nhn/tui.image-editor/issues/68#issuecomment-930106372