Чтение файла

Александр Куваев

Здравствуйте.

Имеется скрипт отправки запроса в контроллер, который читает файл:

var fxhr = new XMLHttpRequest();

fxhr.onload = function (data) {
  DEFAULT_URL = convertDataURIToBinary(JSON.parse(data.target.response).data.content);
};
fxhr.open('POST', window.location.pathname + 'content');
fxhr.send();

И собственно контроллер, который считывает файл:

$productModel = new shopProductModel();
$bookModel
= new shopEbooksPluginItemModel();
$item
= $productModel->getByField('url', waRequest::param('product_code'));
$bookFile
= $bookModel->getByField(array('product_id' => $item['id'],
'book_type' => waRequest::param('reader_state')), false);
$handle
= fopen($this->getBookFullPath($bookFile), 'r');
$content
= fread($handle, $bookFile['file_size']);

$this->response = array('content' => $this->getBaseEncodedFile($content));

При чтении файла большого размера возвращается null, как будто файла нет, если выполнять это не с помощью ajax и контролера, а в обычном php файле, то считывание происходит

21 июня 2016
  • Syrnik.com 21 июня 2016 18:25

    @see waFiles::readFile

    мне кажется может помочь

  • Syrnik.com 21 июня 2016 18:27

    суть в том, что бинарные данные в переменную запихивать немного странная идея

  • Александр Куваев 21 июня 2016 19:56

    Там чтение pdf, а какая альтернатива может быть лучше?

  • Syrnik.com 21 июня 2016 20:40

    Как всегда, при отдаче бинарников. открывать новое окно и отдавать по GET запросу из этого окна.

  • Александр Куваев 21 июня 2016 21:30

    Файл не скачивается пользователем, а просматривается в ридере

  • Syrnik.com 21 июня 2016 22:08

    это зависит от mime-типа. если application/pdf то скорее всего браузер откроет его в просмотрщике pdf (pdf.js для firefox, или плагин для chrome), если заголовок будет application/octet-stream браузер предложит файл сохранить, независимо от содержимого.

    если уж очень нужно именно в js получить бинарные данные, то в самом скрипте нужно как-то так делать

    $content = fread($handle, $bookFile['file_size']);
    echo $content;
    exit;

    Не забыв при этом нужные заголовки отдать. Вы напрасно не хотите посмотреть, что делает метод waFiles::readFile()

    P.s. и чего вдруг такая любовь к fread? file_get_contens же.

  • Александр Куваев 22 июня 2016 02:23

    file get contents используется в текущей реализации, просто выплюнуть содержимое браузеру не подходит. Имеется своя читалка на базе. Pdf.js, в нее и складывается контент.

    С небрльшими книгами 5мб мб больше проблем нет, а вот если книга 50мб то читать не хочет, пропускает



Чтобы добавить комментарий, зарегистрируйтесь или войдите