当前位置: 首页 > 知识库问答 >
问题:

选择文件,设置图像和上传不阻塞UI

戈安翔
2023-03-14

问题

我可以成功地实现以下步骤,但用户界面可能会对2MB或更大的文件没有响应。这些文件的大小与用户可能从相机或桌面上传的文件大小相同,所以我需要处理它们。

>

在客户端,我调整了文件的大小,使其宽度小于等于500px(特别是为了减小大文件的图像大小),并显示图像。

在客户端,我上传了大小较小的文件。

演示

看这把小提琴。

在那里你可以看到上传较大文件时,-停止移动。这种延迟在Chrome上似乎比Firefox更为显著,但在Firefox上仍然很明显。

堵塞原因

>

  • 当文件数据URL设置在img src上时。这是需要的,以便可以在画布中调整图像的大小。

    img。src=e.target。结果//在这里阻塞

    当img被写入画布时。这是调整图像大小所必需的。

    ctx.draw图像(img,0,0,宽度,高度);//这里阻塞

    我考虑过的选择

    >

  • 在Web Worker中执行阻塞操作。这是不可能的,因为Web Worker无法操作DOM元素,并且阻塞调用都在操作DOM时发生。

    调整Web Worker中原始图像数据的大小。不幸的是,我不知道img的格式是什么,所以调整大小需要处理所有图像类型。我不知道有哪个JavaScript库可以做到这一点,我也不特别想编写自己的跨格式图像压缩库。

    直接调整img的大小,但这不会改变需要上传的基础数据大小。

    在服务器上调整大小不是一个选项,因为我想减少上传大小。在客户机上调整大小也更好,因为大图像的内存会提前释放,调整大小的图像会立即显示。

    其他的想法

    我知道设置img src是异步的,所以我猜是数据的复制导致了阻塞。我想知道是否有办法共享相同的数据,而不是复制?

    我正在使用我认为是标准的方法,使用FileReader获取数据URL,然后将数据URL设置为img。src画布。drawImage来调整大小(这里有很多这样的例子)。如果您能帮助我们提高这种或另一种方法的响应能力,我们将不胜感激。


  • 共有1个答案

    沈思博
    2023-03-14

    我想你要做的是

    1. 用户上传图片
    2. 客户端向用户显示降低质量的图像。
    3. 客户端然后将降低质量的图像上传到服务器以供以后使用。

    你遇到的问题是,你强迫javascript(客户端)做一些最有可能在服务器端完成的事情。至于以较低的分辨率显示图像,这可以通过使用绘图轻松实现。没有理由立即在客户端向用户显示实际的精简文件。这是我对您的使用流程的版本。

    1. 用户上传图像
    2. 客户端将其上传到服务器,同时使用drawImage显示分辨率降低的版本
    3. 服务器运行一个与此类似的脚本,将其大小调整为请求的大小
    4. 然后,当将来需要使用映像时,服务器会提供调整大小的版本

    我希望这有帮助!!!

     类似资料:
    • 我正在创建教师表单,我想从图库中选择图像作为个人资料,我想用“选择图像”的标签更改右侧“选择图像按钮”的标签和位置 这是html 这是Css

    • 我想使用FormData将图像上传到我的后端,但由于Ionic DEVAPP和Ionic VIEW不支持文件、文件传输和文件上传插件,我只需要使用Angular Http或HttpClient即可。 当使用DestinationType.FILE_URI时,我可以从文件中获取内部url并将其显示在img对象上,但如果没有本机文件、文件路径和文件传输插件,我无法从该url创建打字脚本文件对象。 }

    • 本文向大家介绍input上传文件可以同时选择多张吗?怎么设置?相关面试题,主要包含被问及input上传文件可以同时选择多张吗?怎么设置?时的应答技巧和注意事项,需要的朋友参考一下

    • 问题内容: 控制器: 视图: Javascript: 但是,我得到一个错误 我试图从ajax发布数据和文件,但是它不起作用。我的问题是如何解决该错误?为什么控制器无法读取用户文件的内容? 谢谢 问题答案: 尝试将您的输入内容放入表单并提供id =’your_form_id表单,然后以这种方式在javascript中发送数据: 然后替换这行 有了这个 也设置以下:

    • 问题内容: 我正在使用Chrome驱动程序使用nightwatch.js运行前端测试。我需要测试图像上传是否正常工作,大概是通过提供的文件输入来进行的,因为在成功发布后会运行回调。 我知道可以使用Selenium Web驱动程序的sendKeys方法来完成。 您如何使用javascript和nightwatch.js完成此操作?您可以访问Selenium Webdriver或与其相关的界面吗? 问

    • 问题内容: 我的laravel ajax应用程序出现问题, 我无法通过ajax POST上传图像/文件。 这是我的代码。 阿贾克斯 刀片模板… 控制器.. 路线.. 我的代码有什么错误? 我无法在laravel控制器中获取文件信息。 我该如何解决这个问题…? 问题答案: 有两点要更改: 从以下位置更改您的js文件: 至: 因为您想发送整个表格。 在您的html中: 在文件输入字段中添加名称 至: