Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174

Огромный blob скачивается с ошибкой

30.08.2022, 15:28. Показов 969. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
В очередной раз ищу помощи гуру своего дела!
Задача обстоит в том, что есть база данных, в ней есть поле БЛОБ в нем лежит файл на 30 мб, да да... Огромный файл, и это плохо но что поделать, он должен быть там...

Но когда я его вынимаю этим кодом из базы...

PHP
1
2
3
4
5
6
7
8
9
10
11
                $link = mysqli_connect("localhost", "my_user", "lol", "files_xpd");                  
 
                  $sql = "SELECT bloob FROM app_update WHERE baza_id=(SELECT max(baza_id) FROM app_update)";
                  $result = mysqli_query($link, $sql);
               
                    ob_clean();
                    flush();
                      while ($row = mysqli_fetch_array($result)) {
                         echo $row['bloob'];
                          }
                mysqli_close($link);
А в приложении андройда качаю и записываю в фаил с помощью этого кода....

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class Downloader extends AsyncTask<Void, Long, Boolean> {
 
        RequestBody formBody = new FormBody.Builder()
                  .... (тут пару параметров, но они не важны...)
 
                .build();
        Request request = new Request.Builder()
                .url("http://127.0.0.1/test.php")
                .post(formBody)
                .build();
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected Boolean doInBackground(Void... params) {
 
            OkHttpClient client = new OkHttpClient();
            Call call = client.newCall(request);
            try {
                Response response = call.execute();
                if (response.code() == 200 || response.code() == 201) {
 
 
                    InputStream inputStream = null;
                    try {
                         inputStream = response.body().byteStream();
                        byte[] buff = new byte[1024*4];
                        long downloaded = 0;
                      
                        long target = 21216044; 
                        File cachePath = new File(getCacheDir(), "files");
 
                        cachePath.mkdirs(); 
                        FileOutputStream fos = new FileOutputStream(cachePath + "/metro332.apk"); 
                        BufferedOutputStream out = new BufferedOutputStream(fos);
 
                        publishProgress(0L, target);
               
                          while (true) {
                            int readed = inputStream.read(buff);
 
                            if (readed == -1)  {
                                break;
                                }
 
                            out.write(buff, 0, readed);
 
                            downloaded += readed;
                            publishProgress(downloaded, target);
                            if (isCancelled()) {
                                return false;
                            }
                        }
 
                        out.flush();
                        out.close();
 
 
                        return downloaded == target;
                    } catch (IOException ignore) {
                        return false;
                    } finally {
                        if (inputStream != null) {
                            inputStream.close();
                        }
                    }
                } else {
                    return false;
                }
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
 
        @Override
        protected void onProgressUpdate(Long... values) {
          тут вывожу прогресс, но это не важно
 
        }
 
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
             File cachePath = new File(getCacheDir(), "images");
             File file = new File(cachePath + "/metro332.apk"); // overwrites this image every time
              if (file.exists()==true) {
                Log.d("!!!", "Размер файла="+file.length());
              !!!!  Размер файла=21216047
              !!!!  Размер файла отличается на 3 байта от того, что лежит в базе.... (21216044 в базе)
            }
 
        }
    }
Файл огромный и передается частями как я понимаю, и скорее всего из за связки "Transfer-Encoding: chunked" + inputStream(который кушает все....)
дополняется еще концом передачи или еще еще чем то.... В общем приходит он в непригодном состоянии может кто помочь сказать, почему? Скорее всего ошибка в PHP коде, потому, выложил это все сюда....
Заранее всем спасибо за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.08.2022, 15:28
Ответы с готовыми решениями:

Апдейт программы, не всегда скачивается файл или скачивается не полностью. Посоветуйте решение...
Здравствуйте! Апдейтю программу, качаются файлы. Но бывает, что один из файлов (или несколько) просто не скачиваются, а создаётся в папке...

Как скопировать содержимое BLOB поля одной записи в BLOB поле другой?
Как скопировать содержимое BLOB поля одной записи в BLOB поле другой?

работа с BLOB в InterBase, запись в BLOB размером более 32 кБ
почему-то не проходит запись в BLOB размером более 32 кБ. научите кто-нибудь. Язык - PHP. Записываю код вот так: if...

10
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
30.08.2022, 16:36
Файл, в котором содержится PHP-код, сохранён в UTF-8 без BOM? Возможно именно этот маркер посылается до содержимого вашего файла.
0
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174
30.08.2022, 16:44  [ТС]
"UTF-8 без BOM" Как это посмотреть? PHP на ubuntu стоит и там через Kate редактирую....
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
30.08.2022, 17:16
С помощью Vim удалить можно:
1) Открываем файл в Vim:
Code
1
vi имя_файла.php
2) Удаляем BOM:
Code
1
:set nobomb
3) Сохраняем и выходим:
Code
1
:wq
Взято отсюда: https://stackoverflow.com/ques... utf-8-file
0
Надуваю лягушек
Эксперт PHP
 Аватар для Царь Бабай
289 / 219 / 93
Регистрация: 01.05.2014
Сообщений: 742
30.08.2022, 18:34
PHP Файл открой в notepad++ и во вкладке кодировки проверь БОМ не БОМ
Попробуй скачать sypex dumper и через него выкачать.
Если ошибка будет - значит смотреть в другую сторону.
0
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174
31.08.2022, 09:05  [ТС]
Открываем файл в Vim:
vi имя_файла.php
:set nobomb
:wq

Все это сделал, количество байт которые приходят не изменилось....
"sypex dumper" - вы намекаете мне, что на сервере лежит битый файл? - Нет 100% файл рабочий. Я его нормально скачиваю через другой метод а именно через
"Response response = client.newCall(request).execute();" Создаю вторичный поток, в нем через ОКхттп делаю такой же запрос и создаю таймер, который проверяет переменную пустая она или нет, самое интересное что через некоторое время переменная заполняется и все работает.... Но я в том случае на сервере делаю так:
PHP
1
2
3
4
5
6
7
8
9
                $link = mysqli_connect("localhost", "my_user", "lol", "files_xpd");
                $sql = "SELECT bloob FROM app_update WHERE baza_id=(SELECT max(baza_id) FROM app_update)";
                  $result = mysqli_query($link, $sql);
                  $SHTAMP_array = array();
                    while ($row = mysqli_fetch_array($result)) {
                    $SHTAMP_array['bloob']=base64_encode($row['bloob']);
                    }
                     echo json_encode($SHTAMP_array, JSON_UNESCAPED_UNICODE);
                       mysqli_close($link);
Как вы видите я вначале файл перекодирую в base64, после запихиваю его в структуру json после только отправляю.....
Но этот метод к сожалению на 1.37 больше занимает места из-за размера не получается его нормально перекодировать назад и не дает отслеживать прогресс скачивания... (Закинул запрос и ждешь пока переменная станет не нулл, это тот костыль от которого я очень хочу избавиться....)
Так в чем может быть причина?
0
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174
31.08.2022, 09:24  [ТС]
Скачал PHP файл с сервера к себе на ПК открыл Нотепадом++ и посмотрел кодировку.... Просто UTF-8 без бом...
Изображения
 
0
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174
31.08.2022, 13:20  [ТС]
Скачал и сравнил 2 файла побайтово.... Как я и думал три лишних байта добавляются в конце номера байтов 10 10 и 10 (по аскикодам) Думаю это ПХП сигнализирует, что конец передачи... Но вот что с этим делать... Есть идеи?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
31.08.2022, 17:55
Лучший ответ Сообщение было отмечено ratix_games как решение

Решение

ratix_games, покажите ваш PHP-код строго в том виде, в каком он хранится в файле.
Может у вас есть закрывающий тег ?> и после него идёт перевод строки?
1
2 / 2 / 0
Регистрация: 28.07.2022
Сообщений: 174
01.09.2022, 08:25  [ТС]
Огромное всем спасибо за помощь!!!!
Действительно после ?> было еще несколько пустых строк! И эти строки передавались в поток..... Вначале я решил эту проблему просто не докачивая их, но теперь полностью удалил из РНР эти несколько строк, вроде все нормализовалось.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
01.09.2022, 09:29
Лучший ответ Сообщение было отмечено ratix_games как решение

Решение

Цитата Сообщение от ratix_games Посмотреть сообщение
полностью удалил из РНР эти несколько строк
Лучше удалить закрывающий PHP-тег ?>. Его не рекомендуется использовать (если, конечно, после PHP-кода не нужно выводить какой-нибудь HTML).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2022, 09:29
Помогаю со студенческими работами здесь

MySQL!Картинка в BLOB! И загрузка файла в BLOB!
Парни! Подскажите плз как заргрузить картинку в BLOB MySQL! Вот так делаю я: ...

выгрузка blob полей в xml и обратная загрузка из xml в blob
Для работы с xml использовал стандартный TXMLDocument. Собственно, вот функция для выгрузки содержимого blob поля: AnsiString...

Огромный код
import java.awt.Cursor; import java.awt.Dialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import...

Огромный отступ
Вот хотел сделать в две колонки, а получилось то что на скрине. Использовал float: left; что бы в два блока. Как можно использовать float...

Огромный график
Создаю график в TChart (спектр) с очень большим количество точек, более 300000. Строю график методом AddXY и тип линии Line. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru