FileReader
备注: 此特性在 Web Worker 中可用。
FileReader
接口允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
文件对象可以从用户使用 <input> 元素选择文件而返回的 FileList 对象中获取,或者从拖放操作的 DataTransfer 对象中获取。
FileReader
只能访问用户明确选择的文件内容,无论是使用 HTML <input type="file">
元素还是通过拖放。它不能用于从用户的文件系统中按路径名读取文件。要按路径名读取客户端文件系统上的文件,请使用文件系统访问 API。要读取服务器端文件,请使用 fetch(),如果跨源读取,则需要 CORS 权限。
EventTargetFileReader
构造函数
返回一个新的 FileReader
对象。
有关详细信息和示例,请参阅在 Web 应用程序中使用文件。
实例属性
一个表示在读取文件时发生的错误的 DOMException。
表示FileReader
状态的数字。取值如下:
常量名 | 值 | 描述 |
---|---|---|
EMPTY | 0 | 还没有加载任何数据。 |
LOADING | 1 | 数据正在被加载。 |
DONE | 2 | 已完成全部的读取请求。 |
文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。
实例方法
中止读取操作。在返回时,readyState
属性为 DONE
。
FileReader.readAsArrayBuffer()
开始读取指定的 Blob 中的内容,一旦完成,result
属性中将包含一个表示文件数据的 ArrayBuffer 对象。
FileReader.readAsBinaryString() 已弃用
开始读取指定的 Blob 中的内容。一旦完成,result
属性中将包含一个表示文件中的原始二进制数据的字符串。
开始读取指定的 Blob 中的内容。一旦完成,result
属性中将包含一个表示文件数据的 data:
URL。
开始读取指定的 Blob 中的内容。一旦完成,result
属性中将包含一个表示所读取的文件内容的字符串。可以指定可选的编码名称。
事件
使用 addEventListener() 方法或通过将事件侦听器分配给此接口的 oneventname
属性来侦听这些事件。一旦不再使用 FileReader
,请使用 removeEventListener() 删除事件侦听器,以避免内存泄漏。
当读取被中止时触发,例如因为程序调用了 FileReader.abort() 方法。
当读取由于错误而失败时触发。
读取成功完成时触发。
读取完成时触发,无论成功与否。
读取开始时触发。
读取数据时定期触发。
前端中这些接口在c++中代码实现如下:
1、FileReader接口定义 third_party\blink\renderer\core\fileapi\file_reader.idl
/*
* Copyright (C) 2010 Google Inc. All rights reserved.
* Copyright (C) 2011 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// https://w3c.github.io/FileAPI/#APIASynch
[
ActiveScriptWrappable,
Exposed=(Window,Worker)
] interface FileReader : EventTarget {
[CallWith=ExecutionContext] constructor();
// async read methods
[RaisesException] void readAsArrayBuffer(Blob blob);
[RaisesException] void readAsBinaryString(Blob blob);
[RaisesException] void readAsText(Blob blob, optional DOMString label);
[RaisesException] void readAsDataURL(Blob blob);
void abort();
// states
const unsigned short EMPTY = 0;
const unsigned short LOADING = 1;
const unsigned short DONE = 2;
[ImplementedAs=getReadyState] readonly attribute unsigned short readyState;
// File or Blob data
readonly attribute (DOMString or ArrayBuffer)? result;
readonly attribute DOMException? error;
// event handler attributes
attribute EventHandler onloadstart;
attribute EventHandler onprogress;
attribute EventHandler onload;
attribute EventHandler onabort;
attribute EventHandler onerror;
attribute EventHandler onloadend;
};
2、FileReader接口实现
third_party\blink\renderer\core\fileapi\file_reader.h
third_party\blink\renderer\core\fileapi\file_reader.cc
/*
* Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_H_
#include "base/timer/elapsed_timer.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/fileapi/file_error.h"
#include "third_party/blink/renderer/core/fileapi/file_read_type.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_client.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_loader.h"
#include "third_party/blink/renderer/core/probe/async_task_context.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
namespace blink {
class Blob;
class ExceptionState;
class ExecutionContext;
class V8UnionArrayBufferOrString;
enum class FileErrorCode;
class CORE_EXPORT FileReader final : public EventTarget,
public ActiveScriptWrappable<FileReader>,
public ExecutionContextLifecycleObserver,
public FileReaderAccumulator {
DEFINE_WRAPPERTYPEINFO();
public:
static FileReader* Create(ExecutionContext*);
explicit FileReader(ExecutionContext*);
~FileReader() override;
enum ReadyState { kEmpty = 0, kLoading = 1, kDone = 2 };
void readAsArrayBuffer(Blob*, ExceptionState&);
void readAsBinaryString(Blob*, ExceptionState&);
void readAsText(Blob*, const String& encoding, ExceptionState&);
void readAsText(Blob*, ExceptionState&);
void readAsDataURL(Blob*, ExceptionState&);
void abort();
ReadyState getReadyState() const { return state_; }
DOMException* error() { return error_.Get(); }
V8UnionArrayBufferOrString* result() const;
probe::AsyncTaskContext* async_task_context() { return &async_task_context_; }
// ExecutionContextLifecycleObserver
void ContextDestroyed() override;
// ScriptWrappable
bool HasPendingActivity() const final;
// EventTarget
const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override {
return ExecutionContextLifecycleObserver::GetExecutionContext();
}
// FileReaderClient
FileErrorCode DidStartLoading() override;
FileErrorCode DidReceiveData() override;
void DidFinishLoading(FileReaderData contents) override;
void DidFail(FileErrorCode) override;
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart, kLoadstart)
DEFINE_ATTRIBUTE_EVENT_LISTENER(progress, kProgress)
DEFINE_ATTRIBUTE_EVENT_LISTENER(load, kLoad)
DEFINE_ATTRIBUTE_EVENT_LISTENER(abort, kAbort)
DEFINE_ATTRIBUTE_EVENT_LISTENER(error, kError)
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend, kLoadend)
void Trace(Visitor*) const override;
private:
class ThrottlingController;
void Terminate();
void ReadInternal(Blob*, FileReadType, ExceptionState&);
void FireEvent(const AtomicString& type);
void ExecutePendingRead();
ReadyState state_;
// Internal loading state, which could differ from ReadyState as it's
// for script-visible state while this one's for internal state.
enum LoadingState {
kLoadingStateNone,
kLoadingStatePending,
kLoadingStateLoading,
kLoadingStateAborted
};
LoadingState loading_state_;
bool still_firing_events_;
String blob_type_;
scoped_refptr<BlobDataHandle> blob_data_handle_;
FileReadType read_type_;
String encoding_;
probe::AsyncTaskContext async_task_context_;
Member<FileReaderLoader> loader_;
Member<V8UnionArrayBufferOrString> result_ = nullptr;
Member<DOMException> error_;
absl::optional<base::ElapsedTimer> last_progress_notification_time_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_H_