visual pictures html vba excel-vba upload image-uploading

pictures - Cargue un archivo a través de<input / input> en formato HTML con VBA



paste image excel vba (2)

Estoy intentando subir un archivo de imagen al sitio de OCR , sin embargo, el archivo PDF no se carga en el sitio.

Estoy usando el siguiente código para lograrlo y debajo está el segmento HTML:

Sub DownPDF() Dim FileName As String: FileName = "C:/Users/310217955/Documents/pdfdown/SGSSI001_HL1464_2011.pdf" Dim DestURL As String: DestURL = "https://www.newocr.com/" Dim FieldName As String: FieldName = "userfile" Call UploadFile(DestURL, FileName, FieldName) End Sub ''******************* upload - begin ''Upload file using input type=file Sub UploadFile(DestURL, FileName, FieldName) ''Boundary of fields. ''Be sure this string is Not In the source file Const Boundary = "---------------------------0123456789012" Dim FileContents, FormData ''Get source file As a binary data. FileContents = GetFile(FileName) ''Build multipart/form-data document FormData = BuildFormData(FileContents, Boundary, FileName, FieldName) ''Post the data To the destination URL IEPostBinaryRequest DestURL, FormData, Boundary End Sub ''Build multipart/form-data document with file contents And header info Function BuildFormData(FileContents, Boundary, FileName, FieldName) Dim FormData, Pre, Po Const ContentType = "application/upload" ''The two parts around file contents In the multipart-form data. Pre = "--" + Boundary + vbCrLf + mpFields(FieldName, FileName, ContentType) Po = vbCrLf + "--" + Boundary + "--" + vbCrLf ''Build form data using recordset binary field Const adLongVarBinary = 205 Dim RS: Set RS = CreateObject("ADODB.Recordset") RS.Fields.Append "b", adLongVarBinary, Len(Pre) + LenB(FileContents) + Len(Po) RS.Open RS.AddNew Dim LenData ''Convert Pre string value To a binary data LenData = Len(Pre) RS("b").AppendChunk (StringToMB(Pre) & ChrB(0)) Pre = RS("b").GetChunk(LenData) RS("b") = "" ''Convert Po string value To a binary data LenData = Len(Po) RS("b").AppendChunk (StringToMB(Po) & ChrB(0)) Po = RS("b").GetChunk(LenData) RS("b") = "" ''Join Pre + FileContents + Po binary data RS("b").AppendChunk (Pre) RS("b").AppendChunk (FileContents) RS("b").AppendChunk (Po) RS.Update FormData = RS("b") RS.Close BuildFormData = FormData End Function ''sends multipart/form-data To the URL using IE Function IEPostBinaryRequest(URL, FormData, Boundary) ''Create InternetExplorer Dim IE: Set IE = CreateObject("InternetExplorer.Application") ''You can uncoment Next line To see form results IE.Visible = True ''Send the form data To URL As POST multipart/form-data request IE.Navigate URL, , , FormData, _ "Content-Type: multipart/form-data; boundary=" + Boundary + vbCrLf Do While IE.Busy Or IE.readyState <> 4 Wait 1, "Upload To " & URL Loop ''Get a result of the script which has received upload On Error Resume Next IEPostBinaryRequest = IE.document.body.innerHTML ''IE.Quit End Function ''Infrormations In form field header. Function mpFields(FieldName, FileName, ContentType) Dim MPTemplate ''template For multipart header MPTemplate = "Content-Disposition: form-data; name=""{field}"";" + _ " filename=""{file}""" + vbCrLf + _ "Content-Type: {ct}" + vbCrLf + vbCrLf Dim Out Out = Replace(MPTemplate, "{field}", FieldName) Out = Replace(Out, "{file}", FileName) mpFields = Replace(Out, "{ct}", ContentType) End Function Sub Wait(Seconds, Message) On Error Resume Next CreateObject("wscript.shell").Popup Message, Seconds, "", 64 End Sub ''Returns file contents As a binary data Function GetFile(FileName) Dim Stream: Set Stream = CreateObject("ADODB.Stream") Stream.Type = 1 ''Binary Stream.Open Stream.LoadFromFile FileName GetFile = Stream.Read Stream.Close End Function ''Converts OLE string To multibyte string Function StringToMB(S) Dim I, B For I = 1 To Len(S) B = B & ChrB(Asc(Mid(S, I, 1))) Next StringToMB = B End Function ''******************* upload - end ''******************* Support ''Basic script info Sub InfoEcho() Dim Msg Msg = Msg + "Upload file using http And multipart/form-data" & vbCrLf Msg = Msg + "Copyright (C) 2001 Antonin Foller, PSTRUH Software" & vbCrLf Msg = Msg + "use" & vbCrLf Msg = Msg + "[cscript|wscript] fupload.vbs file url [fieldname]" & vbCrLf Msg = Msg + " file ... Local file To upload" & vbCrLf Msg = Msg + " url ... URL which can accept uploaded data" & vbCrLf Msg = Msg + " fieldname ... Name of the source form field." & vbCrLf Msg = Msg + vbCrLf + CheckRequirements WScript.Echo Msg WScript.Quit End Sub ''Checks If all of required objects are installed Function CheckRequirements() Dim Msg Msg = "This script requires some objects installed To run properly." & vbCrLf Msg = Msg & CheckOneObject("ADODB.Recordset") Msg = Msg & CheckOneObject("ADODB.Stream") Msg = Msg & CheckOneObject("InternetExplorer.Application") CheckRequirements = Msg '' MsgBox Msg End Function ''Checks If the one object is installed. Function CheckOneObject(oClass) Dim Msg On Error Resume Next CreateObject oClass If Err = 0 Then Msg = "OK" Else Msg = "Error:" & Err.Description CheckOneObject = oClass & " - " & Msg & vbCrLf End Function

Aquí está el segmento HTML.

<input name="userfile" id="userfile" type="file">


Puede utilizar ScriptUtils.ASPForm para aceptar archivos cargados en ASP. ScriptUtils.ASPForm contiene algoritmo de alto rendimiento y bajo consumo de recursos que puede aceptar hasta 2 GB de datos.

  1. Hay algunos pasos para cargar archivos usando http y multipart / form-data document. Antes que nada tenemos que leer el archivo de un disco. Podemos usar Scripting.FileSystemObject para leer datos de texto, o ADODB.Stream para leer cualquier archivo. La función GetFile hace el trabajo usando ADODB.Stream.

  2. La segunda tarea que debemos completar es una compilación de documento multipart / form-data. El documento contiene de varios campos separados por un límite. Cada uno de los campos tiene su propio encabezado, que contiene información sobre el nombre del campo, el nombre del archivo y el tipo de contenido del archivo fuente. El objeto ADO Recordset tiene un gran método AppendChunk, que le permite unir partes del documento multipart / form-data (límites abiertos + encabezados + contenido del archivo + límite cercano). Puede ver el código en la función BuildFormData.

  3. La última tarea es enviar el documento multipart / form-data como una solicitud posterior al servidor con encabezado de tipo de contenido multipart / form-data. Podemos usar al menos dos objetos para enviar una solicitud POST: XMLHttp o InternetExplorer. Este script usa el método Navigate del objeto InternetExplorer.Application. Puede ver el código en la función IEPostBinaryRequest

por favor mira el enlace a continuación para más información.

http://www.motobit.com/tips/detpg_uploadvbsie/

El método GetFile está convirtiendo el archivo a UTF-8. Pdf tendrá más de 128 bytes, necesitas convertirlo a una cadena de bytes múltiples

''Converts OLE string To multibyte stringFunction StringToMB(S) Dim I, B For I = 1 To Len(S) B = B & ChrB(Asc(Mid(S, I, 1))) Next StringToMB = B End Function

Por favor, consulte esta página

http://www.mrexcel.com/forum/excel-questions/861695-using-xmlhttp-upload-file-api.html#post4192153


He pasado varios días experimentando con la misma técnica, utilizando el método Navigate de la interfaz COM InternetExplorer.Application para cargar un archivo.
La documentación de Navigate indica que al especificar el parámetro postdata se activará un HTTP POST, pero en mi experiencia el Content-Type también es un factor determinante. Usando Fiddler descubrí que enviaba sistemáticamente el método GET HTTP en lugar de POST cuando Content-Type = multipart / form-data.

El envío del verbo GET le indicará al servidor que ignore cualquier información de formulario y solo procese el URI.

Esta página indica que tuvo cierto éxito con el objeto XMLHTTP que permite un control más fino sobre la solicitud HTTP. Aquí hay un código de Powershell que demuestra esta técnica:

$http = (New-Object -ComObject "MSXML2.XMLHTTP") $http.Open("POST",$DestURL,$false) $http.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + $boundary) $http.Send($PostData)