Загрузка больших файлов надежно в PHP

Когда вы используете Repeater, убедитесь, что весь ваш контент находится в узле шаблона, например <ItemTemplate> - даже вложенный Repeater.

Как только разметка верна, вы можете прикрепить событие OnItemDataBound к родительскому повторителю, затем использовать идентификатор этого элемента, чтобы получить данные для привязки к вложенному повторителю, а затем просто связать его. Например:

ASPX

        <asp:Repeater ID="R1" runat="server" OnItemDataBound="R1_ItemDataBound">
            <ItemTemplate>
                  <asp:HiddenField runat="server" ID="CompanyId" value='<%# Eval("id") %>' />
                  <div>name:<%# Eval("companyname") %></div>

                  <asp:Repeater ID="R2" runat="server">
                    <ItemTemplate>
                        ID :<%# Eval("companyid") %><br>
                        Name:<%# Eval("companyname") %>
                    </ItemTemplate>
                  </asp:Repeater>
            </ItemTemplate>                
        </asp:Repeater>

CS

    protected void Page_Load(object sender, EventArgs e)
    {   
        if (!Page.IsPostBack)
        {
            DataTable dtx = Getparentfirm();
            R1.DataSource = dtx;
            R1.DataBind();
        }  
    }    

    protected void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
          // Get companyId from hidden field 
          // or you could get it from e.Item.DataItem which should have the data for this row of data
          var CompanyID = (HiddenField)e.Item.FindControl("CompanyId");
          var id = Convert.ToInt32(CompanyID.Value);

          var R2 = (Repeater)e.Item.FindControl("R2");
          var dso = GetData(id); // Get sub companies based on this company id

          R2.DataSource = dso;
          R2.DataBind();
       }  

Что-то в этом роде

24
задан Milan Babuškov 8 December 2013 в 22:50
поделиться

6 ответов

Если Вы отправляете действительно большие файлы, и взволнованный по поводу влияния это будет иметь, Вы могли использовать x-sendfile заголовок.

От SOQ using-xsendfile-with-apache-php, практическое руководство blog.adaniels.nl: how-i-php-x-sendfile /

11
ответ дан Community 28 November 2019 в 23:42
поделиться

Лучшее решение состояло бы в том, чтобы полагаться на lighty или апача, но если в PHP, я буду использовать HTTP_Download ГРУШИ (никакая потребность изобрести велосипед и т.д.), имеет некоторые хорошие функции, как:

  • Основной механизм регулировки
  • Диапазоны (частичные загрузки и возобновление)

Видят документы .

введения/использования
8
ответ дан grossvogel 28 November 2019 в 23:42
поделиться

Для загрузки файлов самым легким путем я могу думать, должен был бы поместить файл во временное местоположение и дать им уникальный URL, который они могут загрузить через регулярный HTTP.

Как часть, генерирующая эти ссылки, Вы могли также удалить файлы, которые составляли больше чем X старых часов.

3
ответ дан Andrew Grant 28 November 2019 в 23:42
поделиться

Когда я сделал это в прошлом, я использовал это:

set_time_limit(0); //Set the execution time to infinite.
header('Content-Type: application/exe'); //This was for a LARGE exe (680MB) so the content type was application/exe
readfile($fileName); //readfile will stream the file.

Эти 3 строки кода сделают всю работу загрузки , readfile () передаст потоком весь файл, определенный клиенту, и, несомненно, еще установит бесконечное ограничение по времени, у можно заканчиваться время, прежде чем файл закончен, передав потоком.

1
ответ дан UnkwnTech 28 November 2019 в 23:42
поделиться

Если бы Вы используете lighttpd в качестве веб-сервера, альтернатива для безопасных загрузок должна была бы использовать ModSecDownload. Этому нужна конфигурация сервера, но Вы позволите веб-серверу обработать саму загрузку вместо Сценария PHP.

Генерация URL загрузки была бы похожа на это (взятый из документации), и это могло, конечно, быть только сгенерировано для авторизованных пользователей:

<?php

  $secret = "verysecret";
  $uri_prefix = "/dl/";

  # filename
  # please note file name starts with "/" 
  $f = "/secret-file.txt";

  # current timestamp
  $t = time();

  $t_hex = sprintf("%08x", $t);
  $m = md5($secret.$f.$t_hex);

  # generate link
  printf('<a href="%s%s/%s%s">%s</a>',
         $uri_prefix, $m, $t_hex, $f, $f);
?>

, Конечно, в зависимости от размера файлов, с помощью readfile() такой, как предложено Unkwntech превосходен. И с помощью xsendfile, как предложено garrow является другой хорошей идеей, также поддерживаемой Apache.

1
ответ дан Community 28 November 2019 в 23:42
поделиться

Я не уверен, что это хорошая идея для больших файлов. Если нить для вашего скрипта загрузки работает, пока пользователь не закончит загрузку, и вы запускаете что-то вроде Apache, всего 50 или более одновременных загрузок могут сбояться с вашим сервером, потому что Apache не предназначен для запуска большого количества долгосрочных нити одновременно. Конечно, я мог бы ошибаться, если поток Apache как-то завершается, и загрузка сидит в буфере где-то, пока загрузка прогрессирует.

0
ответ дан 28 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: