Hi,
I came across this thread prepare a package of data and posting it to a PHP form, http://forum.unity3d.com/threads/109918-prepare-a-package-of-data-and-posting-it-to-a-PHP-form
The problem is that the FileInfo keep append the local path in front of the URL I provided which result an error of DirectoryNotFoundException.
using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;
public class _GameSaveLoad : MonoBehaviour {
//local private members
Rect _Save, _Load, _SaveMSG, _LoadMSG;
bool _ShouldSave, _ShouldLoad, _SwitchSave, _SwitchLoad;
string _FileLocation, _FileName;
public GameObject _Player;
UserData myData;
string _PlayerName;
string _data;
Vector3 VPosition;
public string getFileName;
string url;
//When the EGO is instansiated the Atart will trigger
//so we setup our initial values for our local members
void Start () {
//we setup our rectangles for our messages
_Save = new Rect( 10, 80, 100, 20 );
_Load = new Rect( 10, 100, 100, 20 );
_SaveMSG = new Rect( 10, 120, 100, 20 );
_LoadMSG = new Rect( 10, 140, 400, 40 );
//Where we want to save and load to and from
//_FileLocation = Application.dataPath + @"/Data";
string url="http://localhost/demoProject/upload.php";
_FileLocation = url;
//for now, lets just set the name to Joe Schmoe
_PlayerName = "Joe Schmoe";
//we need something to store the information into
myData = new UserData();
}
// Update is called once per frame
void Update () {
}
void OnGUI () {
//Create File Name
getFileName = GUI.TextField( new Rect( 20, 150, 150, 30 ), getFileName, 45 );
print( getFileName );
_FileName = getFileName + ".xml";
//Loading the player
if( GUI.Button( _Load, "Load" ) ) {
GUI.Label( _LoadMSG, "Loading from: " + _FileLocation );
//Load out userData into myData
LoadXML();
if( _data.ToString() != "" ) {
//notice how I use a referenvce to type (UserData) here, you need this
//so that the returned objects is converted into the correct type
myData = (UserData)DeserializeObject(_data);
//set the players position to the data we loaded
VPosition = new Vector3( myData._iUser.x, myData._iUser.y, myData._iUser.z );
_Player.transform.position = VPosition;
//just a way to show that we loaded in ok
Debug.Log( myData._iUser.name );
}
}
//Saving the player
if( GUI.Button( _Save, "Save" ) ) {
GUI.Label( _SaveMSG, "Saving to: " + _FileLocation );
myData._iUser.x = _Player.transform.position.x;
myData._iUser.y = _Player.transform.position.y;
myData._iUser.z = _Player.transform.position.z;
myData._iUser.name = _PlayerName;
//Time to create our XML
_data = SerializeObject( myData );
//This is the final resulting XML from the serialization process
CreateXML();
Debug.Log( _data );
}
}
//The following methods came from the referenced URL
string UTF8ByteArrayToString( byte[] characters ) {
UTF8Encoding encoding = new UTF8Encoding();
string constructedString = encoding.GetString( characters );
return( constructedString );
}
byte[] StringToUTF8ByteArray( string pXmlString ) {
UTF8Encoding encoding = new UTF8Encoding();
byte[] byteArray = encoding.GetBytes( pXmlString );
return byteArray;
}
//Here we serialize our UserData object of myData
string SerializeObject( object pObject ) {
string XmlizedString = null;
MemoryStream memorystream = new MemoryStream();
XmlSerializer xs = new XmlSerializer( typeof( UserData ) );
XmlTextWriter xmlTextWriteer = new XmlTextWriter( memorystream, Encoding.UTF8 );
xs.Serialize( xmlTextWriteer, pObject );
memorystream = ( MemoryStream )xmlTextWriteer.BaseStream;
XmlizedString = UTF8ByteArrayToString( memorystream.ToArray() );
return XmlizedString;
}
//Here we deserialize it back into its original form
object DeserializeObject( string pXmlizedString ) {
XmlSerializer xs = new XmlSerializer( typeof( UserData ) );
MemoryStream memoryStream = new MemoryStream( StringToUTF8ByteArray( pXmlizedString ) );
XmlTextWriter xmlTextWriter = new XmlTextWriter( memoryStream, Encoding.UTF8 );
return xs.Deserialize( memoryStream );
}
//Save and load methods for the file itself
void CreateXML () {
StreamWriter writer;
string encodedThumbnail = "";
//FileInfo t = new FileInfo( _FileLocation + "/" + _FileName );
FileInfo t = new FileInfo( _FileLocation );
print ( _FileLocation );
if( !t.Exists ) {
writer = t.CreateText();
}
else {
t.Delete();
writer = t.CreateText();
}
writer.Write( _data );
writer.Close();
Debug.Log( "File written" );
XmlDocument newXml = new XmlDocument();
newXml.LoadXml("<_iUser></_iUser>");
XmlNode rootNode = newXml.DocumentElement;
//this would be how you insert the base64 string into a XML element
rootNode.InnerText = encodedThumbnail;
MemoryStream ms = new MemoryStream();
newXml.Save(ms);
byte[] bytes = ms.ToArray();
print ( "xml converted to bytes" );
//Create a Web form
WWWForm form = new WWWForm();
form.AddField( "action", "Upload XML" );
form.AddBinaryData( "fileUpload", bytes, _FileName + ".xml", "text/xml" );
WWW www = new WWW( url, form );
}
void LoadXML () {
StreamReader r = File.OpenText( _FileLocation + "\\" + _FileName );
string _info = r.ReadToEnd();
r.Close();
_data = _info;
Debug.Log( "File Read" );
}
}
//UserData is our custom class that holds our defined objects we want to store in XML format
public class UserData {
//we have to define a default instance of the structure
public DemoData _iUser;
//Default constructor doesn't really do anything at the moment
public UserData(){}
//Anything we want to store in the XML file, we define it here
public struct DemoData {
public float x;
public float y;
public float z;
public string name;
}
}