Cómo cargar datos de red usando el método multipart from en ios
En el proceso de programación de la red, los archivos deben cargarse en el servidor. Multipart/form-data es una forma de cargar archivos.
Multipart/form-data es en realidad la forma en que el navegador utiliza un formulario para cargar archivos. El escenario más común es: al escribir un correo electrónico, agregue un archivo adjunto al final del correo electrónico. El archivo adjunto generalmente se agrega mediante un formulario, es decir, se carga en el servidor en formato de datos de formulario/multiparte.
Subir archivos adjuntos en formulario
¿Cuáles son los pasos específicos?
En primer lugar, el cliente y el servidor establecen una conexión (protocolo TCP).
En segundo lugar, el cliente puede enviar datos al servidor. Porque cargar archivos es esencialmente enviar una solicitud al servidor.
En tercer lugar, el cliente envía datos al servidor en un formato que se ajusta a "multipart/form-data".
¿Cuál es el formato de Multipart/form-data?
Dado que el formato Multipart/form-data es el formato utilizado por los navegadores para enviar datos mediante formularios, echemos un vistazo a cómo se ve el archivo después de ser codificado por el navegador.
//--------------------------------- p>
// este es el código de demostración del uso de multipart/form-data para cargar texto y
fotos.
// -use las API de WinInet.
//
//
// controladores de conexión.
//
HRESULT hr;
HINTERNET m_hOpen;
HINTERNET m_hConnect;
HINTERNET m_hRequest;
//
// establecer conexión.
//
...
//
// forma el contenido.
//
std::wstring strBoundary = std::wstring(L"------------------");
std::wstring wstrHeader( L"Tipo de contenido: multipart/form-data, limite=");
wstrHeader = strBoundary
HttpAddRequestHeaders(m_hRequest, wstrHeader.c_str(),
DWORD(wstrHeader.size()), HTTP_ADDREQ_FLAG_ADD);
//
// "std::wstring strPhotoPath" es el nombre de la foto a cargar.
//
//
// comienzo de la parte del formulario de la foto cargada.
//
std:: wstring strMultipartFirst(L"--");
strMultipartFirst = strBoundary;
strMultipartFirst = L"\r\nDisposición-de-contenido: datos-formulario; nombre=\"pic\"
filename=";
strMultipartFirst = L"\"" strPhotoPath L"\"";
strMultipartFirst = L"\r\nTipo de contenido; : image/jpeg\r\n\r\n";
//
// "std::wstring strTextContent" es el texto a cargar.
//
//
// texto subido parte del formulario start.
//
std::wstring strMultipartInter (L"\r\n--");
strMultipartInter = strBo
undary;
strMultipartInter = L"\r\nContenido-Disposición: formulario-datos;
nombre=\"status\"\r\n\r\n"; p>
p>
std::wstring
wstrPostDataUrlEncode(CEncodeTool::Encode_Url(strTextContent));
// agregar contenido de texto para enviar.
strMultipartInter = wstrPostDataUrlEncode;
std::wstring strMultipartEnd(L"\r\n--");
strMultipartEnd = strBoundary;
strMultipartEnd = L"- -\r\n";
//
// abrir archivo de foto.
//
// ws2s(std ::wstring)
// -transforma "strPhotopath" de Unicode a ansi.
std::ifstream *pstdofsPicInput = new std::ifstream; p>
pstdofsPicInput-gt; open((ws2s(strPhotoPath)).c_str(),
std::ios::binary|std::ios::in);
pstdofsPicInput- gt; seekg(0, std::ios::end);
int nFileSize = pstdofsPicInput-gt;tellg();
if(nPicFileLen == 0)
{
devuelve E_ACCESSDENIED;
}
char *pchPicFileBuf = NULL;
intenta
{
pchPicFileBuf = nuevo char[nPicFileLen];
}
catch(std::bad_alloc)
{
hr = E_FAIL;
}
if(FAILED(hr))
{
return hr;
p>
}
pstdofsPicInput-gt; seekg(0, std::ios::beg);
pstdofsPicInput-gt ;read(pchPicFileBuf, nPicFileLen);
p>
if(pstdofsPicInput-gt;bad())
{
pstdofsPicInput-gt;close ();
hr = E_FAIL;
}
eliminar pstdofsPicInput;
if(FAILED(hr))
{
hora de retorno;
}
// Calcular th
La longitud de los datos a enviar.
std::string straMultipartFirst = CEncodeTool::ws2s(strMultipartFirst);
std::string straMultipartInter = CEncodeTool::ws2s(strMultipartInter);
std::string straMultipartEnd = CEncodeTool::ws2s(strMultipartEnd);
int cSendBufLen = straMultipartFirst.size() nPicFileLen
straMultipartInter.size() straMultipartEnd. size();
// Asigna el búfer para almacenar temporalmente los datos a enviar.
PCHAR pchSendBuf = new CHAR[cSendBufLen];
memcpy(pchSendBuf , straMultipartFirst.c_str(),
straMultipartFirst.size());
memcpy(pchSendBuf straMultipartFirst.size(), (const char *)pchPicFileBuf,
nPicFileLen);
memcpy(pchSendBuf straMultipartFirst.size() nPicFileLen,
straMultipartInter.c_str(), straMultipartInter.size());
memcpy( pchSendBuf straMultipartFirst.size() nPicFileLen
straMultipartInter.size(), straMultipartEnd.c_str(),
straMultipartEnd.size());
//
// envía los datos de la solicitud.
//
HttpSendRequest(m_hRequest, NULL, 0, (LPVOID)pchSendBuf, cSendBufLen)