Tutorial how to upload files using FTP in max via maxscript and dotnet
You can use my FTPUpload script, but for the scripters here some code. In this tutorial you will create a script that upload your scene to your server.
What you will be creating:
Let’s start by creating a new script. For this tutorial we will uploading our scene. So first we have to check if the current scene is saved. The variable maxFilePath contains a String value that defines the file name for the currently open scene. If this is == “”, let’s save the current scene in de default directory (and delete it afterwards).
checkForSave() checks if the latest saved version is outdated. If this is the case the user will be prompt if he wants to save a newer version. Here’s the code.
if maxFilePath == "" do ( saved = saveMaxFile (getdir #scene + "\\" + "FTPUploadTemp.max") if not saved do messageBox "You have to save your file first." \ title:"FTPUpload" ) checkForSave()
For uploading a file we need a dotnetObject : System.Net.WebClient (“Provides common methods for sending data to and receiving data from a resource identified by a URI.“). (ftp://example.com/example.max).
We will use the UploadFileAsync(Uri, String) method (“Uploads the specified local file to the specified resource, using the POST method. This method does not block the calling thread.”). So let’s type :
if maxFilePath != "" do ( sceneName = maxFilePath + maxFileName webClient = dotnetObject "System.Net.WebClient" webClient.Credentials = dotnetObject "System.Net.NetworkCredential"\ "user" "pass" theUri=dotnetObject "System.Uri" \ ("ftp://josbalcaen.com/josbalcaen.com/www/public/"+maxFileName) webClient.UploadFileAsync theUri sceneName )
This code should work. The file is uploaded to our directory. But how do we know if the upload is completed? Let’s make a rollout with a progressbar!
Put the code from above in the event on btnUpload pressed do (…insert code here…).
rollout rollFTPUpload "FTP Upload" width:200 ( edittext edtFtp "FTP" text:"ftp://example.com/" \ width:(rollFTPUpload.width-5) align:#center edittext edtUser "USER" text:"" width:(rollFTPUpload.width-5) \ align:#center edittext edtPass "PASS" text:"" width:(rollFTPUpload.width-5) \ align:#center button btnUpload "Upload" width:(rollFTPUpload.width-5) align:#center progressbar pgbProgress width:(rollFTPUpload.width-5) \ align:#center color:(color 0 255 0) height:5 value:100 on btnUpload pressed do ( ) ) createDialog rollFTPUpload style:#(#style_toolwindow,#style_sysmenu)
Now we have a rollout with some text fields and a button. If you press the button the file should upload fine. To use the edittext , replace “user” with edtUser.text and similar for pass and ftp. Now we have to define 2 functions, UploadProgressChanged and UploadFileCompleted. You can name this like you want, but we will name it the same as the eventHandlers for obviousness.
Also move the code that creates the webClient to the top. So let’s put the following code above :
function UploadProgressChanged = () function UploadFileCompleted = () webClient = dotnetObject "System.Net.WebClient"
So let’s add the functions. In the UploadProgressChanged function we simply update the progressbar. If the file is uploaded, the UploadFileCompleted function will be called. We also have to tell the webClient object to use these functions with addEventHandler. We do this when the dialog opens.
Add this code between “progressbar pgbProgress” and “on btnUpload pressed“.
function UploadProgressChanged sender args = ( pgbProgressFile.value=args.ProgressPercentage ) function UploadFileCompleted sender args = ( if args.Error==undefined do ( messageBox ("file has uploaded succesfull! \n " +\ edtFtp.text + maxFileName) ) ) on rollFTPUpload open do ( dotnet.addEventHandler webClient "UploadProgressChanged" \ UploadProgressChanged dotnet.addEventHandler webClient "UploadFileCompleted" \ UploadFileCompleted )
Done! If you want to upload more than one file, you should do this if the previous file is completed. Give a reply if everythings fine,