2015-10-21 7 views
5

के साथ एचटीएमएल फॉर्म में <इनपुट \ इनपुट> के माध्यम से एक फ़ाइल अपलोड करें मैं OCR Site पर एक तस्वीर फ़ाइल अपलोड करने की कोशिश कर रहा हूं, हालांकि, पीडीएफ फाइल साइट पर अपलोड नहीं होती है।वीबीए

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 = "---------------------------" 

    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 

यहाँ एचटीएमएल खंड है:

मैं निम्नलिखित कोड का उपयोग कर रहा इसे प्राप्त करने के और नीचे HTML खंड है।

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

+0

1, आप 'URL' को नेविगेट कर रहे हैं, लेकिन DestURL' घोषित' इतना कोड होना चाहिए: 'WebBrowser.Navigate DestURL'। दूसरा, एचटीएमएल स्रोत देखें। उस यूआरएल पर फ़ाइल चयन बॉक्स आईफ्रेम में है, इसलिए इनपुट को वास्तव में 'fileUpload' कहा जाता है और फ्री- online-ocr.com/upload.aspx पर रहता है। उस पृष्ठ पर अन्य नियंत्रण प्रोग्रामेटिक रूप से बनाए और छुपाए गए हैं (उदाहरण के लिए '__EVENTVALIDATION') और संभवतः उनकी नि: शुल्क सेवा के स्क्रिप्ट किए गए स्वचालन को रोकने के लिए मौजूद हैं। ऐसा हो सकता है कि फ़ाइल को भेजने के बजाय जैसे बटन दबाया गया हो, आप फ़ाइल चयन प्रक्रिया को स्वचालित करने की जांच कर सकते हैं। – Tim

+0

मैंने इसे फिर से देखा, और आपके पास एक और समस्या है। आपके विवरण में लिंक (ओसीआर साइट) newocr.com पर है, लेकिन आपके कोड में लिंक मुफ्त- online-ocr.com है। इससे यह स्पष्ट नहीं होता है कि आप वास्तव में किस साइट पर इंटरफेस करने की कोशिश कर रहे हैं और कोड वास्तव में अलग-अलग साइट पर निर्भर करता है जिस पर आप वास्तव में स्वचालित करना चाहते हैं। क्या यह खोज इंजन रैंकिंग के लिए सिर्फ कुछ लिंक बिल्डिंग योजना है, या क्या आपको अपनी पोस्ट को साफ करने की आवश्यकता है? – Tim

+0

इसके newocr.com, मैंने देखा है कि मैंने पोस्ट करने से पहले कोड को फिर से कॉन्फ़िगर किया था। खेद है कि मैंने यहां गलत ओसीआर साइट का इस्तेमाल किया था। – Adhil

उत्तर

1

आप एएसपी में अपलोड की गई फ़ाइलों को स्वीकार करने के ScriptUtils.ASPForm उपयोग कर सकते हैं। ScriptUtils.ASPForm में उच्च-प्रदर्शन, कम संसाधन खपत एल्गोरिदम शामिल है जो 2 जीबी डेटा तक स्वीकार कर सकता है।

  1. http और multipart/form-data दस्तावेज़ का उपयोग कर फ़ाइल अपलोड करने के कुछ चरण हैं। सबसे पहले हमें डिस्क से फ़ाइल पढ़नी है। हम किसी भी फ़ाइल को पढ़ने के लिए टेक्स्ट डेटा, या ADODB.Stream पढ़ने के लिए Scripting.FileSystemObject का उपयोग कर सकते हैं। GetFile फ़ंक्शन ADODB.Stream का उपयोग करके काम करता है।

  2. दूसरा कार्य जिसे हमें पूरा करने की आवश्यकता है वह मल्टीपार्ट/फॉर्म-डेटा दस्तावेज़ का निर्माण है। दस्तावेज़ सीमा से अलग कई क्षेत्रों से है। प्रत्येक फ़ील्ड का अपना हेडर होता है, जिसमें फ़ील्ड नाम, फ़ाइल नाम और स्रोत फ़ाइल के सामग्री-प्रकार के बारे में जानकारी होती है। एडीओ रिकॉर्ड्स ऑब्जेक्ट में एक शानदार विधि AppendChunk है, जो आपको मल्टीपार्ट/फॉर्म-डेटा दस्तावेज़ (खुली सीमा + शीर्षलेख + फ़ाइल सामग्री + बंद सीमा) के हिस्सों में शामिल होने देता है। आप BuildFormData फ़ंक्शन में कोड देख सकते हैं।

  3. अंतिम कार्य मल्टीपार्ट/फॉर्म-डेटा दस्तावेज़ को मल्टीपार्ट/फॉर्म-डेटा सामग्री-प्रकार शीर्षलेख के साथ सर्वर पर पोस्ट अनुरोध के रूप में भेजता है। हम POST अनुरोध - XMLHttp या InternetExplorer भेजने के लिए कम से कम दो ऑब्जेक्ट का उपयोग कर सकते हैं। यह स्क्रिप्ट InternetExplorer.Aplication ऑब्जेक्ट की नेविगेट विधि का उपयोग करती है। आप IEPostBinaryRequest फ़ंक्शन

में कोड देख सकते हैं कृपया अधिक जानकारी के लिए नीचे दिए गए लिंक को देखें।

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

GetFile विधि UTF-8 में फ़ाइल परिवर्तित। पीडीएफ, 128 से अधिक बाइट होगा आप इसे बहु बाइट स्ट्रिंग के लिए कनवर्ट करने के लिए

'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 

कृपया इस पृष्ठ

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

+1

आपको बहुत धन्यवाद, शायद आप इसके बारे में थोड़ा और विस्तार कर सकते हैं? – Adhil

+0

आपको बहुत बहुत धन्यवाद, लेकिन आप कैसे कर सकते हैं लेकिन आप वेब ब्राउज़र में एक मल्टीबाइट डेटा कैसे भेज सकते हैं? – Adhil

+0

जो लिंक मैंने प्रदान किया है वह विस्तार समाधान है। – newjenn

0

मैं कई दिनों के खर्च किया है उसी तकनीक के साथ प्रयोग करने का उल्लेख की जरूरत है - फ़ाइल अपलोड करने के लिए InternetExplorer.Aplication COM इंटरफ़ेस की नेविगेट विधि का उपयोग करना।
Navigate के लिए प्रलेखन इंगित करता है कि पोस्टडेटा पैरामीटर निर्दिष्ट करने से एक HTTP पोस्ट ट्रिगर होगा, लेकिन मेरे अनुभव में सामग्री-प्रकार भी एक निर्धारित कारक है। फिडलर का उपयोग करके मैंने पाया कि सामग्री-प्रकार = मल्टीपार्ट/फॉर्म-डेटा के दौरान यह POST के बजाय लगातार HTTP विधि भेज रहा था।

जीईटी क्रिया भेजना सर्वर को किसी भी फॉर्म डेटा को अनदेखा करने के लिए बताएगा, और केवल यूआरआई को संसाधित करेगा।

This page इंगित करता है कि उन्हें XMLHTTP ऑब्जेक्ट के साथ कुछ सफलता मिली है जो HTTP अनुरोध पर बेहतर नियंत्रण की अनुमति देता है। यहाँ कुछ Powershell कोड है कि इस तकनीक को दर्शाता है है:

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