2015-04-03 8 views
3

У меня есть приложение angularjs, где пользователь должен иметь возможность импортировать данные из текстовых файлов. Перед загрузкой я хотел бы прочитать несколько строк из файла на клиентской стороне, чтобы сделать некоторые проверки. Я использую https://github.com/nervgh/angular-file-upload для загрузки файла. Я могу загрузить файл и выполнить проверку на стороне сервера, но файлы могут быть не более нескольких мегабайт, и я не хочу создавать ненужный трафик, если данные недействительны.проанализировать файл в контроллере angularjs перед загрузкой

Внутри моего контроллера У меня есть следующий код:

$scope.validateFile = function(file){ 

    console.log(file.name); 
    console.log(file.size);  
    var reader = new FileReader(); 

    reader.onloadend = function(evt){  
    console.log(evt.target.result); 
    //do something with file content here 
    }; 

    //var blob = file.slice(0, file.size - 1); 
    reader.readAsText(file); 

}; 

При запуске консоли выводит имя файла и размер. После этого я получил ошибку follwoing:

TypeError: Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'. 

Когда я удалить комментарий из следующей строки ...

var blob = file.slice(0, file.size - 1); 

и измените последнюю строку быть:

reader.readAsText(blob); 

это ошибка от пульта

TypeError: undefined is not a function 

Похоже, что функция среза не работает. Почему slice() не работает? Можно ли так это сделать?

UPDATE:

Основываясь на комментарий DTing я обнаружил ошибку

Мой оригинальный HTML был

<input type="file" nv-file-select="" uploader="uploader" multiple /><br/> 
... 
<tr ng-repeat="item in uploader.queue"> 
... 
ng-click="validateFile(item.file)" 

Я изменил последнюю строку

ng-click="validateFile(item._file)" 

Теперь его работает.

+0

Ваш код должен работать, поэтому вы, вероятно, не передаете файл в функцию. Что дает вам 'console.log (файл)'? – DTing

+0

Благодарим вас за ответ. Это первая часть вывода: FileLikeObject {lastModifiedDate: Пт Апр 03 2015 11:21:48 GMT + 0200 (Центральноевропейское летнее время), размер: 47, введите: "text/plain", name: "test.txt ", _createFromFakePath: function ...} –

+0

Я не передаю файлы, которые вы передаете в конструкции, которую использует угловая загрузка файла, чтобы представлять файлы, которые копируют имя и размер. Невозможно помочь в этом вопросе, если вы не добавите больше кода, и мы увидим, с чем и с кем вы вызываете эту функцию. – DTing

ответ

0

Посмотрите на файл API спецификации, раздел FileReader: https://developer.mozilla.org/en-US/docs/Web/API/FileReader

Он имеет ряд методов .readAsXXX, это позволит вам проверить содержимое файла перед загрузкой на сервер.

+0

Спасибо, btk, Это не то, что я искал, но это хорошее дополнение к оригинальному вопросу. Я знаю о FIle API, моя проблема заключалась в том, что я работал с неправильным объектом. Благодаря DTing я решил свою проблему. Я принимаю этот ответ, чтобы закрыть этот поток, потому что я не могу принять комментарий DTing. –

Смежные вопросы