- Home /
Help with saving XML files with PHP to a server
Hi All,
I had serialize the object and trying to post it to my php, Unity3d shows url malformed whenever I click save button.
_GameSaveLoad.cs
[CODE]
using UnityEngine; using System.Collections; using System.Xml; using System.Xml.XPath; 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;
byte[] bytes;
//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 ) {
UTF8Encoding encoding = new UTF8Encoding();
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() );
bytes = StringToUTF8ByteArray( XmlizedString );
UploadFile( url );
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 );
}
IEnumerator UploadData (string uploadURL) {
WWWForm postForm = new WWWForm();
postForm.AddField( "action", "Upload Data" );
postForm.AddBinaryData( "fileUpload", bytes, _FileName, "text/xml" );
WWW upload = new WWW(uploadURL, postForm);
yield return upload;
if( upload.error == null ) {
Debug.Log(upload.text);
}
else {
Debug.Log( "Error during upload: " + upload.error );
}
}
void UploadFile( string uploadURL ) {
StartCoroutine( UploadData( uploadURL ) );
}
//Save and load methods for the file itself
void CreateXML () {
StreamWriter writer;
//string encodedThumbnail = "";
FileInfo t = new FileInfo( _FileLocation + "/" + _FileName );
if( !t.Exists ) {
writer = t.CreateText();
}
else {
t.Delete();
writer = t.CreateText();
}
writer.Write( _data );
writer.Close();
Debug.Log( "File written" );
}
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;
}
}
[/CODE]
upload.php [CODE]
if(!isset($_FILES) && isset($HTTP_POST_FILES))
$_FILES = $HTTP_POST_FILES;
if(!isset($_FILES['fileUpload']))
$error["data_file"] = "An data was not found.";
$dataname = basename($_FILES['fileUpload']['name']);
if(empty($dataname))
$error["dataname"] = "The name of the data was not found.";
if(empty($error)) {
$newdata = "data/" . $dataname;
//echo $newimage;
$result = @move_uploaded_file($_FILES['fileUpload']['tmp_name'], $newdata);
if ( empty($result) )
$error["result"] = "There was an error moving the uploaded file.";
}
}
}
else {
echo "no form data found";
}
?>
[/CODE]
Comment