Maison >développement back-end >tutoriel php >Comment analyser manuellement les données brutes multiparts/données de formulaire en PHP ?

Comment analyser manuellement les données brutes multiparts/données de formulaire en PHP ?

DDD
DDDoriginal
2024-11-02 18:39:03209parcourir

How to Manually Parse Raw Multipart/Form-Data Data in PHP?

Analyse manuelle des données brutes Multipart/Form-Data en PHP

Lors du traitement des données des requêtes HTTP PUT avec le format multipart/form-data, PHP n'analyse pas automatiquement les données brutes. Par conséquent, les développeurs peuvent rencontrer des difficultés pour extraire des informations de telles requêtes.

Solution :

  1. Lire les données brutes de la requête :

    • Utilisez file_get_contents('php://input') pour lire les données brutes.
  2. Extraire la limite du type de contenu En-tête :

    • Utilisez une expression régulière pour capturer la valeur limite de l'en-tête Content-Type ($_SERVER['CONTENT_TYPE']).
  3. Diviser les données par limite :

    • Divisez les données brutes en blocs individuels à l'aide de preg_split("- $boundary").
  4. Séparez les blocs en champs individuels :

    • Pour chaque bloc :

      • Téléchargé Fichiers :

        • Recherchez les blocs contenant application/octet-stream et extrayez le nom du champ et le nom du fichier.
      • Autre Champs :

        • Extraire le nom et la valeur du champ à l'aide d'une expression régulière.

示例 Code :

<code class="php">function parse_raw_http_request(array &$a_data)
{
  $input = file_get_contents('php://input');
  preg_match('/boundary=(.*)$/', $_SERVER['CONTENT_TYPE'], $matches);
  $boundary = $matches[1];

  $a_blocks = preg_split("/-+$boundary/", $input);
  array_pop($a_blocks);

  foreach ($a_blocks as $id => $block)
  {
    if (empty($block))
      continue;

    if (strpos($block, 'application/octet-stream') !== FALSE)
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;.*stream[\n|\r]+([^\n\r].*)?$/s', $block, $matches);
    }
    else
    {
      preg_match('/name=\&quot;([^\&quot;]*)\&quot;[\n|\r]+([^\n\r].*)?\r$/s', $block, $matches);
    }
    $a_data[$matches[1]] = $matches[2];
  }
}</code>

Utilisation :

<code class="php">$a_data = array();
parse_raw_http_request($a_data);
var_dump($a_data);</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn