- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在使用自定义 API 来允许用户上传文件(希望是任意大小的文件)。如果文件太大,它将被分 block ,并在对服务器的多个请求中处理。
根据网上的许多示例,我正在编写使用 File
和 FileReader
(HTML5) 的代码。通常(根据我在网上阅读的内容)对于分 block 文件传输,人们首先会从他们的文件对象中获取一团数据
var file = $('input[type=file]')[0].files[0];
var blob = file.slice(start,end)
然后使用 FileReader
读取 blob readAsArrayBuffer(blob)
或 readAsBinaryString(blob)
最后在 FileReader.onload(e)
方法中,将数据发送到服务器。对文件中的所有 block 重复此过程。
我的问题是
为什么我需要使用 FileReader
?如果我不使用它,而只是使用 File.slice
发送 blob,是否可以保证在我尝试在每个请求中发送数据之前完成切片操作。 File
对象是否在创建时加载整个文件(肯定不会?)。 File.slice
是否查找到参数规定的位置,然后读入里面的信息?该文档没有给我关于它是如何实现的线索。
最佳答案
要记住的重要一点是,File继承自Blob,File实际上没有slice方法,它从Blob中获取这个方法。文件只是添加了几个元数据属性。
将 Blob(或文件)视为指向数据的指针,而不是实际数据本身。有点像其他语言中的文件句柄。
如果不使用读取器,您实际上无法获取 Blob 中的数据,读取器异步读取以避免阻塞 UI 线程。
Blob slice() 方法只是返回另一个 Blob,但同样,这不是数据,它只是指向原始 Blob 中一系列数据的指针,有点像指向 View 的有界指针。要真正从切片的 Blob 中获取字节,您仍然需要使用读取器。在切片 blob 的情况下,您的读者是有界的。
这实际上只是为了方便起见,这样您就不必在代码中携带一堆相对和绝对偏移量,您可以获得数据的有界 View 并像使用阅读器一样使用阅读器从字节 0 开始读取。
在 XMLHttpRequest 的情况下(假设浏览器支持较新的接口(interface))数据将在发送时流式传输,并受 blob 边界的约束。基本上,如果您将文件指针发送到流方法(这基本上是幕后发生的事情),它将以您想象的方式工作。 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Sending_binary_data
本质上,它是一个懒惰的读者。如果 blob 已经从文件系统加载/读取,或者是在内存中创建的,它就会使用它。但是,当您使用 File 时,它将延迟加载并从主线程异步流出。
这里的基本逻辑是浏览器开发者永远不希望读取同步发生,因为它可能会阻塞主线程,因此所有 API 都是围绕该核心理念设计的。请注意 Blob.slice() 是如何同步的 - 这就是您知道它实际上没有执行任何 IO 的方式,它只是设置边界和(可能)文件指针。
关于javascript - HTML5 File.slice 方法实际上在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833487/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!