Red de conocimiento informático - Material del sitio web - Cómo enviar correctamente datos binarios mediante HTTPS POST

Cómo enviar correctamente datos binarios mediante HTTPS POST

Aún no conozco los detalles específicos de la carga de archivos HTTP, pero sé que para cargar archivos a través del navegador y luego recibirlos con PHP, necesitas usar la variable predefinida de PHP $_FILES. tiene una aplicación que necesita usar la variable predefinida de PHP $_POST obtiene el archivo cargado (o cualquier dato), que consiste en pasar datos binarios a través de parámetros HTTP POST.

Funciona con ContentType = "application/x-www -form-urlencoded" En modo, el protocolo HTTP utiliza un subconjunto del juego de caracteres ASCII para codificar el flujo de bytes que se transmitirá. Por ejemplo, si la cadena "a@" existe en la memoria (en forma de matriz de bytes) en codificación ASCII, es decir, la memoria El HEX leído por bytes es: 0x61 0x40, luego, cuando se transmite la matriz de bytes, se codificará (codificada en URL) en 0x61 0x25 0x34 0x30. La codificación ASCII será "a40". En otras palabras, cuando desee transmitir 0x61 0x40, HTTP transmitirá 0x61 0x25 0x34 0x30.

Este proceso de codificación es compatible con casi todos los lenguajes de programación. puedes usar HttpUtility.UrlEncode (), ingresar una matriz de bytes y devolver una matriz de bytes codificada en URL.

En scripts PHP, cuando usas $_POST['data'] para obtener la matriz, la matriz se ha decodificado automáticamente Según el ejemplo anterior, el contenido de la memoria señalado por $_POST['data'] es 0x61 0x40; sin embargo, no siempre es el caso de forma predeterminada si los datos contienen algunos caracteres, como single. PHP lo agregará delante de \.

El script PHP se proporciona a continuación para guardar un archivo pasado a través de parámetros HTTP:

lt;?php

$ nombre de archivo = $_POST['nombre de archivo'];

$datos = $_POST['datos'];

if(get_magic_quotes_gpc()){

// Eliminar barras

$data = stripslashes($data);

}

file_put_contents($filename, $data); ;

El cliente C# está:

usando System;

usando System.Text;

usando System.Net;

usando System.Web;

usando System.IO;

prueba de clase

{

public static void Main( ){

intentar{

respuesta WebResponse

solicitud HttpWebRequest

solicitud = (HttpWebRequest)HttpWebReq;

uest.Create("http://localhost/test.php");

request.Method = "POST";

request.ContentType = "aplicación/x-www- form-urlencoded";

String filename = "test.jpg";

// nombre del parámetro HTTP

byte[] keyBytes = Encoding.UTF8.GetBytes (String.Format("filename={0}amp; data=", filename));

FileStream fs = new FileStream(filename, FileMode.Open);

byte[ ] buffer = nuevo byte[8192];

int n = fs.Read(buffer, 0, buffer.Length);

byte[] dataArray = nuevo byte[n];

Array.Copy(buffer, dataArray, n);

dataArray = HttpUtility.UrlEncodeToBytes(dataArray);

request.ContentLength = keyBytes.Length dataArray. Longitud;

Stream dataStream = request.GetRequestStream();

//Enviar nombre del parámetro

dataStream.Write(keyBytes, 0, keyBytes.Length);

//Envía el valor correspondiente denominado data.

dataStream.Write(dataArray, 0, dataArray.Length);

dataStream.Close(); /p>

respuesta = (HttpWebResponse)request.GetResponse();

// Lee la respuesta del servidor, si es normal, devuelve una cadena vacía.

StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));

Console.Write(sr.ReadToEnd()

< respuesta);

.Close();

} catch (Excepción e) {

Console.Write("Error: " e.ToString() "\r\n");

}

}