Кратко
Из соображений безопасности внешний интерфейс не может напрямую записывать в файл. Однако в реальных бизнес-потребностях неизбежно приходится сталкиваться с загрузкой и предварительным просмотром различных файлов.
Если файл загрузки сервера доставляется на внешний интерфейс в виде потока, внешний интерфейс обычно преобразует поток вobjectURL,заниматьaпомеченdownloadсвойства для загрузки файла. Но иногда возникает сценарий, когда обработка загружаемого файла не выполняется, поэтому возвращаемый формат сообщения сервера уже не поток, аjson, в настоящее время, несмотря на то, что внешний интерфейс может нормально экспортировать файл, содержимое файла представляет собой сообщение, возвращаемое сервером, и утилизация не очень уместна. В настоящее время хорошо иметь способ прочитать поток. В этой статье дается краткий обзор того, как внешний интерфейс читает двоичные потоки.
загрузка бинарного файла
Обычная загрузка бинарного файла: сначала нужно изменить заголовок запросаresponse-typeУстановить какblob, а во-вторых, при получении ответного сообщения могут быть вызваны следующие методы.
function download(blob) {
// 创建一个blob链接
let url = URL.createObjectURL(blob)
let a = document.createElement('a')
a.setAttribute('download', url)
a.href=ur;
a.style.display = 'none'
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
// 每次调用URL.createObjectURL,都会创建一个新的URL对象,浏览器内存中会保持对该对象的引用
// 只有在document销毁时,才会释放此部分内存
// 在考虑性能的情况下,在url使用结束后,最好释放此部分内存
URL.revokeObjectURL(url)
}
чтение бинарных файлов
Выше приведен только общий метод загрузки бинарных потоковых файлов, когда тип ответа, возвращаемый серверомcontent-type=application/jsonКогда мы все еще имеем способ разбираться в обработке двоичной поток, могут привести к проблемам с содержимым файла экспорта, например Excel, содержимое ответа сервера сообщений, поэтому мы имеем дело с контентом ответа на сервер, необходимо выполнить в передней части перехватить.
- объявить переменную блоба
var debug = { hello: "world" };
var blob = new Blob([JSON.stringify(debug, null, 2)], {type : 'application/json'})
blobСуществует два основных способа чтения контента.FileReaderа такжеResponse.
FileReader
FileReaderКак следует из названия, этот объект в основном используется для чтения содержимого файла, и совместимость относительно хорошая.Существуют следующие форматы для чтения содержимого:readAsArrayBuffer,readAsBinaryString,readAsDataURL,readdAsText.FileReaderМетод чтения в основном заключается в следующем:
var reader = new FileReader()
reader.addEventListener('loadend', function (e) {
// 输出字符串 {hello: world}
console.log(e.target.result)
})
reader.readAsText(blob)
Response
ResponseдаFetch APIИнтерфейс, который представляет ответ на запрос данных. Коэффициент совместимости браузераFileReaderпочти, поддерживаюChrome 42+,FireFox 39+.
Responseсоздавать экземпляр
let myResponse = new Response(body, init)
-
bodyBlobBufferSourceFormDataURLSearchParamsUSVString
-
initstatusstatusTextheaders
ResponseДостигнутоbodyинтерфейс, поэтому при создании экземпляраResponse, вы можете позвонитьBody.blob(),body.formData(),body.json(),body.text()Сериализация возвращаемого значения, возвращаемое значение представляет собойPromise.具体实现方法如下所示:
var blobReader = new Response(blob).json()
blobReader.then(res => {
console.log(res)
})
резюме
С помощью метода анализа возвращаемого значения сервера, когда мы загружаем файл, мы можем больше судить о возвращаемом значении сервера.content-type, если возвращаемое значение неblob, мы можем выполнить некоторую индивидуальную обработку.