easiest way to download a file - vbscript

There are many examples on the Internet and the simplest/easiest for a beginner seems to be:
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", "http://bla.com/ea_csv_160126.csv", False
xHttp.Send
with bStrm
.type = 1 '//binary
.open
.write xHttp.responseBody
.savetofile "c:\myFolder\ea_csv_160126.csv", 2 '//overwrite
end with
This returns:
Write to file failed code: 800A0BBC source ADODB.Stream
I would like to debug this one, there are people complaining about this error but no fix.
Also, If possible, I would like to define a variable in order to hold the value for the date. So the script should be able to download the file from the website adapting to the changed value in the URL 160126 will be something else.
Note: on the same website, there is a file which has almost the same name ea_csv_update_160126.csv, the one with update shouldn't be taken.
EDIT:
If you know a simpler or equally easy solution which works, please post it.

Related

Download and save a webpage using vbscript

I am trying to give users the option to download and save a webpage to where ever they want. I have been looking all over for a solution but nothing seems to be working. I am using vbscript in classic asp.
This is what I tried last
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", "" &Session("ServerURL") & "/idautomation/IDAutomationStreamingLinear.aspx?D=MAPS$"&request.QueryString("catcode")&"%25"&request.QueryString("typecode")&"&X=0.09&BH=3&S=0&CC=T&LM=5&TM=7.5&ST=F", False
xHttp.Send
with bStrm
.type = 1 '//binary
.open
.write xHttp.responseBody
.savetofile "d:\DownloladPdf.pdf", 2 '//overwrite
end with
but its throwing a "Write to file failed. " on the .savetofile line.
I want the user to be able to chose where to save it to...
You can't save to the users computer from server side code VBscript directly as this would be a major security issue allowing drive by compromises of people browsing a web page. The reason possibly that it is throwing an error is that it is trying to save it server side, but there is no D: on the server.
Instead you want to serve the PDF to the browser using Response and let the browser display or save the PDF.
The below example is using a bytes array rather than a stream, but it should be similar. If you want to force it to download rather than show in the browser, change the content-disposition to attachment. You can also change the filename to whatever you like.
if Len(pdfBytes) > 0 then
Response.Clear()
Response.ContentType = "application/pdf"
Response.Charset = ""
Response.AddHeader "Cache-Control", "public, max-age=1" ' Setting Cache-Control to max-age=1 rather than no-cache due to IE8 bug
Response.AddHeader "content-disposition","inline; filename=filename.pdf"
Response.Buffer = True
Response.Expires = 0
Response.BinaryWrite(pdfBytes)
Response.Flush
Response.End
Response.Close
end if

Convert Excel workbook to CSV with user-provided filenames

First, I need to delete the top 4 rows from the sheet either before or after the conversion. There currently isn't anything in this script that will delete rows from the Excel file or from the CSV file that it creates.
Second, I'd prefer to pass the source and destination in this script rather then passing them later. Currently this script requires a command line to pass the source and destination it looks something like this.
C:\exceltocsv "source.xls" "destination.csv"
Instead of requiring source.xls and destination.csv to be provided as commandline arguments I'd rather have them resolved in the VBScript itself. Is this possible?
if WScript.Arguments.Count < 2 Then
WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv"
Wscript.Quit
End If
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
oBook.SaveAs WScript.Arguments.Item(1), 6
oBook.Worksheets(2).Activate
oBook.Close False
oExcel.Quit
WScript.Echo "Done"
You can use the InputBox function to prompt for user input. Rows can be removed from an Excel worksheet via <range>.EntireRow.Delete.
Something like this should do what you want:
xls = InputBox("Enter source file.")
csv = InputBox("Enter destination file.")
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(xls)
oBook.Sheets(1).Range("1:4").EntireRow.Delete
oBook.SaveAs csv, 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"
Edit: If you want hardcoded paths, simply define them as strings:
xls = "C:\path\to\input.xls"
csv = "C:\path\to\output.csv"
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(xls)
oBook.Sheets(1).Range("1:4").EntireRow.Delete
oBook.SaveAs csv, 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"
Thanks to Ansgar Wiechers I was able to come up with this script
xls = "C:\[Path]"
csv = "c:\[Destination]"
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(xls)
oBook.Worksheets(2).Activate
oBook.Worksheets(2).Rows("1:4").Delete
oBook.SaveAs csv, 6
oBook.Close False
oExcel.Quit
And it runs like a champ in cmd. Thanks a million!
However, I went to implement this into my process and found out that SQL Server Agent has major issues in executing VBScripts.
cscript is the command that is suggested to execute the script, but it doesn't work. After more research I found that other people have had similar issues and they all suggest writing the script in VB.NET instead of VBScript. This way SSIS can process the script.
Ansgar I marked your response as the answer since it answered my question, but sadly it only lead me to a dead end with VBScript.

Insert image from URL in Excel: error for various methods

I am trying to insert a picture from a website into an excel sheet, but I get an error message, no matter which method I try.
The URL I use ("MyURL") is in the format:
https:// x.x.x.x:pppp/chart.png?id=10...apid=secretkey
But if I use any other picture url, it works... even if it has parameters, eg.:
http:// www.mrexcel.com/forum/avatars/[personsname].gif?dateline=2007
MyUrl works fine in any browser, but not in Excel.
I have used these methods:
A) Pictures.Insert
ActiveSheet.Pictures.Insert ("MyURL")
gives error: "Runtime error 1004: Unable to get the Insert property of the Pictures class"
B) Shapes.AddPicture
wsht.Shapes.AddPicture "MyURL", msoFalse, msoTrue, 0, 0, 100, 100
gives error: "Runtime error 1004: The specified file was not found"
C) Insert > Pictures > Paste URL in file name
gives error: "An error occurred while importing this file"
D) Convert MyUrl into a short URL
gives error:
A - "Insert method of picture class failed"
B - "The specified file was not found"
C - "An error occurred while importing this file"
My system:
Windows 8, Excel 2013
What is the problem?
Thanks for the help.
I found a work-around to the problem (not in Excel)... using VBscript to save the image, and then import it into Excel. The problem was with the security certificate. With the script the error is ignored.
dim xHttp: Set xHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xHttp.setOption 2, 13056
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", "MyURL", False
xHttp.Send
with bStrm
.type = 1 '//binary
.open
.write xHttp.responseBody
.savetofile "c:\BI\SyncScript\graph.png", 2 '//overwrite
end with
It may me related to your Internet Settings and/or Security Settings.............If you run this tiny macro with an empty sheet active:
Sub PictureGrabber()
With ActiveSheet.Pictures
.Insert ("http://www.dogbreedinfo.com/images26/PugPurebredDogFawnBlackMax8YearsOld1.jpg")
End With
End Sub
What happens??

Is XMLHTTP's responsebody working asynchronously in VB6?

We have a SSRS integrated sharepoint server. I am trying to get a report exported as PDF from it.
(I had to do like this, because my url is too long. I would rather use Shell command to do like this, although this looks like a better solution.)
Here'is my code:
Dim request as New XMLHTTP
Dim oStream as New Stream
Dim aBunchOfMiliseconds as Long
Dim fileLocation as String
Dim reportUrl as String
aBunchOfMiliseconds = 500
reportUrl = "http://www.mySharepointDomain.com/_vti_bin/ReportServer?http://www.mySharepointDomain.com/sites/AFolderHere/OOAnotherFolder/BlaBlaReportFolder/FolderFolder/AhTheLastOne/AtLeastMyReportFile.rdl&rs:Command=Render&rc:Toolbar=true&rs:Format=PDF&Parameter1=ABC &Parameter2=1&Parameter3=1&TheLastParameter=IllBeDamned&rs%3aParameterLanguage=ln-LN"
request.Open "GET", reportUrl
request.setRequestHeader "WWW-Authenticate", "NTLM" 'For impersonation
request.Send 'Go get it Bruce
If request.Status = 200 Then 'Are you successful?
oStream.Type = adTypeBinary
oStream.Open
oStream.Write request.responseBody 'Here's the problematic part
Sleep(aBunchOfMiliseconds) 'If I don't do this, file will be corrupted
oStream.SaveToFile fileLocation, adSaveCreateOverWrite
oStream.Close
End If
Set oStream = Nothing
Set request = Nothing
If I comment out the "Sleep" line, I will have a corrupted file that can not open. This code works fine but I found it ridiculus to use "Sleep" there.
Is there any way me to understand that the data copy operation is completed?
Oh I get it.
I've missed to say that "this is not an async call".
request.Open "GET", reportUrl, False

msxml3.dll Access Denied

I have the following code:
Function filejson(json)
Dim objStream, strData
Set objStream = CreateObject("ADODB.Stream")
objStream.CharSet = "utf-8"
objStream.Open
objStream.LoadFromFile(json)
strData = objStream.ReadText()
filejson = strData
End Function
Function http2json(url)
Set http = CreateObject("Microsoft.XmlHttp")
http.open "GET", url, FALSE
http.send "" '<------- Line 13
http2json=http.responseText
End Function
Function str2json(json,value)
Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
scriptControl.Language = "JScript"
scriptControl.AddCode("x="& json & ";")
str2json= scriptControl.Eval( "x"& value )
End Function
Function get_json_from_file(json,value)
get_json_from_file=str2json(filejson(json),value)
End Function
Function get_json_from_http(url,value)
get_json_from_http=str2json(http2json(url),value)
End Function
Function save_json_from_http(url,loc)
Set fso = CreateObject("Scripting.FileSystemObject")
fullpath = fso.GetAbsolutePathName(loc)
Dim objStream, strData
Set objStream = CreateObject("ADODB.Stream")
objStream.CharSet = "utf-8"
objStream.Open
objStream.WriteText http2json(url)
objStream.SaveToFile fullpath, 2
save_json_from_http=fullpath
End Function
Wscript.Echo save_json_from_http("http://api.themoviedb.org/3/authentication/session/new?api_key=#####some_api_key_example#####&request_token=#####some_default_request_token######&_ctime_json_=1372670635.164760555","tmdb\temp\_tmdb_sock_w.164519518.2109")
When I run this code, I get the following error.
If I remove &request_token=#####some_default_request_token###### it works just fine.
I also tried this: I added again the request_token, and I just typed a random character in it, for example, rexfuest_token, and strangely it worked. It seems there's a wrong parse in msxml3.dll. with request_token word.
Ideas?
This problem could be related to the security issues in Windows. The best way to fix it is to replace Microsoft.XmlHttp/MSXML2.XMLHTTP with MSXML2.ServerXMLHTTP.
I see the topic is almost 2 years old and most likely the topic starter has solved is issue. I have experienced the same issue couple hours ago and google provided me several links. There are some of them:
https://social.msdn.microsoft.com/Forums/en-US/1abda1ce-e23c-4d0e-bccd-a323aa7f2ea5/access-is-denied-while-using-microsoftxmlhttp-to-get-a-url-link-in-vbscript-help?forum=xmlandnetfx
https://support.webafrica.co.za/index.php?/Knowledgebase/Article/View/615/41/msxml3dll-error-80070005-access-is-denied---loading-xml-file
http://www.experts-exchange.com/Programming/Languages/Scripting/ASP/Q_27305017.html
Try with a more recent version:
Set http = CreateObject("Msxml2.XMLHttp.6.0")
It could also be an issue with your Internet security settings (see here). Open the Internet Options applet in the Control Panel, select the zone for the website (probably "Trusted sites") in the Security tab and click Custom level….
In the section Miscellaneous set Access data sources across domains to Enabled.
Also can change URL from http to https. Me helps
For me the solution was to add the URL in trusted sites.
Internet explorer browser > Tools > Internet options > Security > Trusted sites > Sites > Add the URL under "Add this website to the zone: " and click add and save.

Resources