- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个关于 File API 的问题以及用 JavaScript 上传文件以及我应该如何执行此操作。
我已经使用了一个非常简单的文件 uploader ,它只是从输入中获取文件并向服务器发出请求,然后服务器处理这些文件并将副本文件上传到服务器上的上传目录中。
但是,我试图让人们可以选择在上传文件之前预览文件。因此,我利用了 File API,特别是 new FileReader()
和下面的 readAsDataURL()
。
文件对象具有 .size
和 .lastModifiedDate
等属性列表,我将 readAsDataURL()
输出添加到我的文件中对象作为属性,以便在我的 Angular ng-repeat()
中轻松访问。
我的问题是,当我这样做时,我想到我可以将 dataurl 存储在数据库中而不是上传实际文件?我不确定直接使用文件数据的 dataurl 作为属性修改文件数据是否会影响其传输。
最佳实践是什么?上传文件更好还是可以只存储 dataurl 然后输出它,因为这本质上是文件本身?我不应该直接修改文件对象吗?
谢谢。
编辑:我还应该注意,这是一个客户项目,希望用户很难简单地从应用程序中获取上传的内容并保存它,然后重新分发它。将文件保存为数据库中的 URL 会减轻右键单击另存为行为的影响吗?
最佳答案
预览文件的方法不止一种。正如您提到的,第一个是带有 filereader 的 dataURL 。但还有URL.createObjectURL哪个更快
与二进制格式相比,与 Base64 进行解码和编码将花费更长的时间,需要更多的计算、更多的 CPU/内存。
我可以在下面演示
var url = 'https://upload.wikimedia.org/wikipedia/commons/c/cc/ESC_large_ISS022_ISS022-E-11387-edit_01.JPG'
fetch(url).then(res => res.blob()).then(blob => {
// Simulates a file as if you where to upload it throght a file input and listen for on change
var files = [blob]
var img = new Image
var t = performance.now()
var fr = new FileReader
img.onload = () => {
// show it...
// $('body').append(img)
var ms = performance.now() - t
document.body.innerHTML = `it took ${ms.toFixed(0)}ms to load the image with FileReader<br>`
// Now create a Object url instead of using base64 that takes time to
// 1 encode blob to base64
// 2 decode it back again from base64 to binary
var t2 = performance.now()
var img2 = new Image
img2.onload = () => {
// show it...
// $('body').append(img)
var ms2 = performance.now() - t2
document.body.innerHTML += `it took ${ms2.toFixed(0)}ms to load the image with URL.createObjectURL<br><br>`
document.body.innerHTML += `URL.createObjectURL was ${(ms - ms2).toFixed(0)}ms faster`
}
img2.src = URL.createObjectURL(files[0])
}
fr.onload = () => (img.src = fr.result)
fr.readAsDataURL(files[0])
})
base64 将增大约 3 倍。对于移动设备,我认为您会希望节省带宽和电池。
但是执行额外请求也会产生延迟,但这就是 http 2 来拯救的地方
关于javascript - 文件上传 ReadAsDataUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608802/
此函数读取从输入字段获取的文件并返回它们的 dataUrls: readAsDataURL (target) { // target => var reader = new FileRead
我试图在我的网站中实现拖放功能。我需要将拖放的图像转换为数据 URI,以便我可以将它与 JCrop 一起使用并在之后上传。 drop: function (e) {
如果用户将图像拖到浏览器中,我已在代码中添加了一个 eventListerner 进行注册。然后我想获取图像的src。我在本地使用 xampp 工作。这是行不通的。控制台显示“匿名函数”和 Uncau
在使用 readAsDataURL 读取图像时,如何强制返回图像类型(如果没有返回), window.onload = function() { if (window.File && wind
我有一个关于 File API 的问题以及用 JavaScript 上传文件以及我应该如何执行此操作。 我已经使用了一个非常简单的文件 uploader ,它只是从输入中获取文件并向服务器发出请求,然
我正在使用 PhoneGap 编写我的第一个 Android 应用程序,但我对 FileReader 的文档感到有点困惑。我需要获取一个图像文件并使用 readAsDataURL() 方法将其转换为
在 Gecko/Firefox 中我收到错误信息: TypeError: fr.readAsDataurl is not a function 使用以下 JavaScript: var fr = ne
我正在尝试使用 FileReader(0.10.3) 读取 jpg 文件。因为当我调用 readAsDataURL 时,它会出现错误并显示消息:“无法读取为文件:{}”。我查看了指向该方法内部的错误,
好吧,我已经看到了很多有关使用 readAsDataURL() 的示例和问题,但它们似乎都不能解决我的问题。以下是我的代码: $(document).ready(function(){ var
美好的一天,我如何更改我的代码,以便它接受带有预览的多个图像上传,并且用户可以删除和设置主图像。 顺便说一句,我的代码只允许上传一张图片。 这是我到目前为止所得到的: _handleImageChan
有没有一种方法可以操纵(处理)来自 HTML5 FileReader 函数 readAsDataUrl() 的图像数据? 我感兴趣的是加载图像并仅显示它的一部分。我可以只剪切数据字符串并且它可以工作,
我在从某个文件中获取 URI 时遇到了一些麻烦,例如 .mp4/.ogg/etc..问题是我需要在运行网络服务器的 python 中完成。 最初,我是这样进行的: def __parse64(self
我有一个需要保存的文件列表,除了名称之外,我还需要将 readAsDataURL 发送到服务器。 问题是我不确定如何使用 readAsDataURL 的异步特性来完成它。因为要将 DATAURL 保存
当我将一个文件加载到浏览器中时,我想向用户显示一个动画加载 gif。但是如果文件很大,浏览器看起来很忙,我的 gif 动画就无法工作。我可以做些什么来可视化加载? HTML JS reader.re
jsFiddle 网址:http://jsfiddle.net/Xotic750/AjtLx 整天都在处理这个问题,但我看不到问题所在。这可能是由于我对 FileReader 对象如何工作的狭隘理解,
我找不到任何使用 FileReader.readAsDataURL 并在容器中以正确的图像方向 显示结果图像的示例。 所有来 self 的相机和 iPhone 设备的人像图像都有这个问题。只有用ado
我试图使用 Cordova 文件插件的 readAsDataURL 函数来获取视频文件的 base64 版本,但没有成功。我的代码如下所示: recordVideo() { retur
我正在使用 readAsDataURL 加载图像,如下所示... function previewFile() { console.log('Start Function') var prev
我有一个文件输入,然后在添加后预览图像。图像显示,但我得到:未捕获类型错误:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型。” 是什么原因造成的,它
我有一个 HTML5 图像编辑器,我想启用用户上传的自定义字体。 我想使用 HTML5 FileReader.readAsDataURL 将用户提供的字体存储在数据库中。将其存储在数据库中后,我希望能
我是一名优秀的程序员,十分优秀!