www.webdeveloper.com
Page 1 of 2 12 LastLast
Results 1 to 15 of 29

Thread: Uploading and downloading music files to and from Mysql

Hybrid View

  1. #1
    Join Date
    May 2014
    Posts
    30

    Uploading and downloading music files to and from Mysql

    Hello there

    I have to make a website with a database for a CS class at university that allows the user to search for a piece of music or a particular sound effect, preview the media and then have the option to download or implement another search.

    My issue is how do I go about uploading the music/fx files to MySQL, and then retrieving them?

    In terms of populating my web page with the items from the database I know can do that by using tables but in terms of getting the files into the db via the webpage, this is still a bit confusing to me.

    I've seen somewhere that I need use filetype blob/longbow which will house the file location of the media file but they didn't go into great detail on how to do this or in fact what a blob is.

    Any help would be massively appreciated.

    Thanks in advance

  2. #2
    Join Date
    May 2014
    Posts
    77
    Quote Originally Posted by Jcse7en View Post
    Hello there

    I have to make a website with a database for a CS class at university that allows the user to search for a piece of music or a particular sound effect, preview the media and then have the option to download or implement another search.

    My issue is how do I go about uploading the music/fx files to MySQL, and then retrieving them?

    In terms of populating my web page with the items from the database I know can do that by using tables but in terms of getting the files into the db via the webpage, this is still a bit confusing to me.

    I've seen somewhere that I need use filetype blob/longbow which will house the file location of the media file but they didn't go into great detail on how to do this or in fact what a blob is.

    Any help would be massively appreciated.

    Thanks in advance
    Is there any reason you want to store the file in the database?
    I would store the file name, author, other information in the database, but put the MP3 itself just somewhere usually not reachable on the server. Then store that location in the database too.

  3. #3
    Join Date
    May 2014
    Posts
    30
    Quote Originally Posted by Gravy View Post
    Is there any reason you want to store the file in the database?
    I would store the file name, author, other information in the database, but put the MP3 itself just somewhere usually not reachable on the server. Then store that location in the database too.
    I understand this but I wanted some detailed help on how to go about this if possible.

  4. #4
    Join Date
    May 2014
    Posts
    77
    Quote Originally Posted by Jcse7en View Post
    I understand this but I wanted some detailed help on how to go about this if possible.
    I was in a little of a rush when I wrote that, let's just make up a very simple example where the MP3 is available to everyone to download freely, (no security considerations):

    You upload a file "super.mp3" through a PHP script.
    An entry is added to the database

    PHP Code:
    Database Entry
    (
        [
    id] => 1
        
    [filename] => super.mp3
        
    [songname] => Super Song!

    The file is uploaded to "http://www.site.com/music/$id.mp3" which for this entry is "http://www.site.com/music/1.mp3".

    This prevents unusual file names doing unusual things.

    You could then have them download the file with a simple link.

    PHP Code:
    <a href="/music/<?=$entry['id'];?>.mp3" download="<?=$entry['filename'];?>">Download <?=$entry['songname']?></a>
    which would result in
    PHP Code:
    <a href="/music/1.mp3" download="super.mp3">Download Super Song!</a
    Unfortunately download= is not yet supported in all browsers, and there is a little more cleaning to do around the place, however this is the very basics of a very basic version where you're not trying to limit access to files.

    If you really wanted to limit file access you could use a better version of:
    PHP Code:
    if ($user->hasDownloadPermissions) {
    header('header required to force download');
    header('other header required for file name or whatever');
    echo 
    file_get_contents('music/'.(int)$_GET['id'].'.mp3);

    Of course that script is horrible, but it's just for the concept.

  5. #5
    Join Date
    May 2014
    Posts
    30
    Quote Originally Posted by Gravy View Post
    I was in a little of a rush when I wrote that, let's just make up a very simple example where the MP3 is available to everyone to download freely, (no security considerations):

    You upload a file "super.mp3" through a PHP script.
    An entry is added to the database

    PHP Code:
    Database Entry
    (
        [
    id] => 1
        
    [filename] => super.mp3
        
    [songname] => Super Song!

    The file is uploaded to "http://www.site.com/music/$id.mp3" which for this entry is "http://www.site.com/music/1.mp3".

    This prevents unusual file names doing unusual things.

    You could then have them download the file with a simple link.

    PHP Code:
    <a href="/music/<?=$entry['id'];?>.mp3" download="<?=$entry['filename'];?>">Download <?=$entry['songname']?></a>
    which would result in
    PHP Code:
    <a href="/music/1.mp3" download="super.mp3">Download Super Song!</a
    Unfortunately download= is not yet supported in all browsers, and there is a little more cleaning to do around the place, however this is the very basics of a very basic version where you're not trying to limit access to files.

    If you really wanted to limit file access you could use a better version of:
    PHP Code:
    if ($user->hasDownloadPermissions) {
    header('header required to force download');
    header('other header required for file name or whatever');
    echo 
    file_get_contents('music/'.(int)$_GET['id'].'.mp3);

    Of course that script is horrible, but it's just for the concept.
    Ok this makes a lot sense now, thanks!!

    Just one last thing what NogDog was talking referring to re the actual MP3 being stored in a file system and the database just housing the MP3 info as it were, is that how I go about it? Couldn't it work with just having the file location of the mp3 in the database (mysql) as a blob or longblob?

    Thanks again Gravy your help has been invaluable.

  6. #6
    Join Date
    May 2014
    Posts
    77
    Quote Originally Posted by Jcse7en View Post
    Ok this makes a lot sense now, thanks!!

    Just one last thing what NogDog was talking referring to re the actual MP3 being stored in a file system and the database just housing the MP3 info as it were, is that how I go about it? Couldn't it work with just having the file location of the mp3 in the database (mysql) as a blob or longblob?

    Thanks again Gravy your help has been invaluable.
    Yes, that's what he was talking about, just having the MP3's as normal files stored on the server and not in the database.
    Having the file location in the database is exactly what I mean, however I wouldn't store it as anything as long as a blob or longblob.

    I would honestly keep the filename stored in the database as a simpler varchar, which can have up to 256 characters, enough length for any file I've ever (in any sane, non-harddisk crashing situation) encountered.

    I would also change the filename when storing it to a simple number.mp3, this can save you heartache in the future when you come across unusual file names, such as 我的音乐.mp3 which suddenly causes problems between the browser, php, mysql, and the os communicating happily. PHP and windows don't communicate well with file names of some foreign languages.


    ==== OFF ON A TANGENT ====
    I always prefer to set my databases to (I think it's) UTF8-general-ci, so it can store pretty much any character and set my page meta tags to UTF-8.

    PHP Code:
    <meta charset="utf-8"
    Then again that's a whole different story.
    ==== OFF OF MY TANGENT ====

    So I often prefer to use the id of the database entry for the file name, and add the .mp3 to the end too. It also removes having to think about various other security issues such as dodgy file names and such.

    You could do it either way, since I work in foreign languages quite a lot, I end up getting these type of bias'. Also make sure if users are uploading files, to make sure they can only upload .mp3 files, and not .php files and other such scary file types.

  7. #7
    Join Date
    Aug 2004
    Location
    Ankh-Morpork
    Posts
    19,607
    +1

    My general rule: databases are for storing data, while filesystems are for storing files.

    You typically end up creating a server-side program that is your file server. So your application code would, upon doing whatever database stuff, etc., provide the user with a link to that file server file that includes the necessary ID field or whatever to identify the desired file. Then that script would look up the file path-name info in the DB, set the applicable HTTP headers, and read/output the file. In a rather over-simplified PHP script (very little defensive coding, no user auth, etc.):
    PHP Code:
    <?php
    $sql 
    "SELECT file_path, content_type FROM file_table WHERE file_id = :file_id";
    $stmt $pdo->prepare($sql);
    $stmt->execute(array(':file_id'$_GET['file_id']));
    $row $stmt->fetch(PDO::FETCH_ASSOC);
    if(
    $path != false) {
        
    header('Content-Type: '.$row['content_type']); // probably some other headers here, too
        
    readfile($row['file_path']);
        exit;
    }
    header('HTTP/1.0 404 Not Found');
    "Please give us a simple answer, so that we don't have to think, because if we think, we might find answers that don't fit the way we want the world to be."
    ~ Terry Pratchett in Nation

    eBookworm.us

  8. #8
    Join Date
    May 2014
    Posts
    30
    Quote Originally Posted by NogDog View Post
    +1

    My general rule: databases are for storing data, while filesystems are for storing files.

    You typically end up creating a server-side program that is your file server. So your application code would, upon doing whatever database stuff, etc., provide the user with a link to that file server file that includes the necessary ID field or whatever to identify the desired file. Then that script would look up the file path-name info in the DB, set the applicable HTTP headers, and read/output the file. In a rather over-simplified PHP script (very little defensive coding, no user auth, etc.):
    PHP Code:
    <?php
    $sql 
    "SELECT file_path, content_type FROM file_table WHERE file_id = :file_id";
    $stmt $pdo->prepare($sql);
    $stmt->execute(array(':file_id'$_GET['file_id']));
    $row $stmt->fetch(PDO::FETCH_ASSOC);
    if(
    $path != false) {
        
    header('Content-Type: '.$row['content_type']); // probably some other headers here, too
        
    readfile($row['file_path']);
        exit;
    }
    header('HTTP/1.0 404 Not Found');
    I'm sorry kind of get what you mean but not entirely.

    Are you saying the actual music files when uploaded by the user will then got to the file system with the details going to the database?

    If this is the case then when the user wanted to retrieve a particular music file, after they implemented a search, how would the results show on the web page? Would the link to the file be generated from the database?

    Also could you possibly explain further the concept of the file system in this instance, could I use something like filezilla and if so how would I go about this?

    Sorry if this is a stupid question just need clarification before I start to implement. Thanks very much by the way, to both of you.

  9. #9
    Join Date
    Aug 2004
    Location
    Ankh-Morpork
    Posts
    19,607
    If you store it as a blob in the DB, every time someone downloads a "file", every single byte has to be pulled from the DB into the application (often on different servers) before being put into the output stream; so the main reason I don't like doing that is the unnecessary load it puts on the DB. It can be done, and there may even be some good reasons to do it in some situations -- but I can't really think of any off-hand. Also, it may require some mucking about with the database configuration to allow it to transfer that much data for one request.
    "Please give us a simple answer, so that we don't have to think, because if we think, we might find answers that don't fit the way we want the world to be."
    ~ Terry Pratchett in Nation

    eBookworm.us

  10. #10
    Join Date
    May 2014
    Posts
    30
    I keep thinking its the last question and then another pops up.

    Was trying to run some basic php scripts yesterday to test uploading a file and I was finding even though the tests I did that test connections worked it seems that when I ran the scripts nothing happened. I didn't even get an error message.

    Now I'm using phpmyadmin and it seemed that I everything was correct in the setup but still nothing is happening.

    This scripts are below.

    Is it possible that it could be a problem with the config.inc.php file? Oh I'm using XAMPP by the way.


    <form enctype="multipart/form-data" action="upload.php" method="POST">
    Name: <input type="text" name="name"><br>
    Genre: <input type="text" name = "genre"><br>
    Track: <input type="file" name = "track"><br>
    <input type="submit" value="Upload">
    </form>



    <?php

    // Connects to your Database
    mysql_connect("localhost", "root", "my_password") or die(mysql_error()) ;
    mysql_select_db("fxmas") or die(mysql_error()) ;

    //This is the directory where music will be saved
    // $target = "music/";
    //$target = $target . basename( $_FILES['track']['name']);

    //This gets all the other information from the form
    $name=$_POST['name'];
    $genre=$_POST['genre'];
    $file=$_FILES(['track']['tmp_name']);

    }
    ?>

  11. #11
    you shop it like a blob within the DB, each time somebody downloads a "document", each byte needs to be drawn in the DB in to the software (frequently on various machines) before being put in the output flow; therefore the major reason I actually don't like doing that's the needless weight it places about the DB. It may be completed, and there might even be good quality reasons to complete it in certain circumstances -- but I can not think of any off hand. Additionally, it might need some mucking about using the database setup to permit it to move that much information for just one request

  12. #12
    Join Date
    May 2014
    Posts
    30
    Hey guys trying to get this audio uploading script to work but I can't seem to get anything into the database. I think something may have gone awry with my variables perhaps. Could you possibly point out where I'm going wrong if you can see it that is. Feel like my brain is melting
    Thanks v.much as always

    [ php ]

    <!doctype html>

    <html lang="en">
    <head>
    <!--how browser interprets stuff-->
    <meta charset="utf-8" />
    <title>FXMAS</title>

    <link rel="stylesheet" href="main.css" />

    </head>
    <body>
    <div id="big_wrapper">

    <form enctype="multipart/form-data" action="upload.php" method="POST">
    File: <input type="file" name = "file"><br>
    <input type="submit" value="Upload">
    </form>



    <header id="main_header">

    <h1></h1>
    <h4></h4>
    </header>

    <nav id="menu">
    <form method="get" action="/search" id="search">
    <input name="q" type="text" size="40" placeholder="Search..." />
    </form>
    <ul>
    <li><a href="music.php">Music</li>
    <li><a href="fx.php">FX</li>
    <li><a href="upload.php">Upload</li>
    <li><a href="forum.php">Forum</li>
    <li><a href="reports.php">Reports</li>
    <li><a href="about.php">About</li>
    </ul>
    </nav>
    <section>
    <article>
    <header>
    <hgroup> <!--when you have more than one header-->
    <h1></h1>
    <h2></h2>
    </hgroup>
    </header>
    <p></p>
    <footer>
    <p>written by Jamie 2014</p>
    </footer>
    </article>

    <article>
    <header>
    <hgroup> <!--when you have more than one header-->
    <h1></h1>
    <h2></h2>
    </hgroup>
    </header>
    <p></p>
    <footer>
    <p></p>
    </footer>
    </article>
    </section>

    <aside>
    <h4></h4>

    </aside>
    <footer>

    </footer>
    </div>
    </body>
    </html>

    <?php

    // Connects to your Database
    mysql_connect("localhost", "root", "") or die(mysql_error()) ;
    mysql_select_db("mydb") or die(mysql_error()) ;




    if ((($_FILES["file"]["type"] == "audio/mp3")
    || ($_FILES["file"]["type"] == "audio/mp4")
    || ($_FILES["file"]["type"] == "audio/wav"))
    && ($_FILES["file"]["size"] < 1000000))
    {
    if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
    else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
    {
    echo $_FILES["file"]["name"] . " already exists. ";
    }
    else

    $mp3_name = $_FILES["file"]["name"];
    $mp3_path = "pload/$mp3_name";

    move_uploaded_file($_FILES["file"]["tmp_name"], $mp3_path);

    $sql = "INSERT INTO 'music' SET name='$mp3_name', location'$mp3_path'";
    $result = mysql_query($sql);
    if($result)
    {
    echo 'MP3 Upload successfully';
    }
    else
    {
    echo 'ERROR: Upload Failed';
    }

    }
    }
    else
    {
    echo "Invalid file";
    }
    ?>

    [ /php ]

  13. #13
    Join Date
    May 2014
    Posts
    30
    Hey guys trying to get this audio uploading script to work but I can't seem to get anything into the database. I think something may have gone awry with my variables perhaps. Could you possibly point out where I'm going wrong if you can see it that is. Feel like my brain is melting
    Thanks v.much as always

    PHP Code:

     <!doctype html>

     <html lang="en">
     <head>
     <!--how browser interprets stuff-->
     <meta charset="utf-8" />
     <title>FXMAS</title>

     <link rel="stylesheet" href="main.css" />

     </head>
     <body>
     <div id="big_wrapper">

     <form enctype="multipart/form-data" action="upload.php" method="POST"> 
     File: <input type="file" name = "file"><br> 
     <input type="submit" value="Upload"> 
     </form>



     <header id="main_header">

     <h1></h1>
     <h4></h4>
     </header>

     <nav id="menu">
     <form method="get" action="/search" id="search">
     <input name="q" type="text" size="40" placeholder="Search..." />
     </form>
     <ul>
     <li><a href="music.php">Music</li>
     <li><a href="fx.php">FX</li>
     <li><a href="upload.php">Upload</li>
     <li><a href="forum.php">Forum</li>
     <li><a href="reports.php">Reports</li>
     <li><a href="about.php">About</li>
     </ul>
     </nav>
     <section>
     <article>
     <header>
     <hgroup> <!--when you have more than one header-->
     <h1></h1>
     <h2></h2>
     </hgroup>
     </header>
     <p></p>
     <footer>
     <p>written by Jamie 2014</p>
     </footer>
     </article>

     <article>
     <header>
     <hgroup> <!--when you have more than one header-->
     <h1></h1>
     <h2></h2>
     </hgroup>
     </header>
     <p></p>
     <footer>
     <p></p>
     </footer>
     </article>
     </section>

     <aside>
     <h4></h4>

     </aside>
     <footer>

     </footer>
     </div>
     </body>
     </html>

     <?php 

     
    // Connects to your Database 
     
    mysql_connect("localhost""root""") or die(mysql_error()) ; 
     
    mysql_select_db("mydb") or die(mysql_error()) ; 




     if (((
    $_FILES["file"]["type"] == "audio/mp3")
     || (
    $_FILES["file"]["type"] == "audio/mp4")
     || (
    $_FILES["file"]["type"] == "audio/wav"))
     && (
    $_FILES["file"]["size"] < 1000000))
     {
     if (
    $_FILES["file"]["error"] > 0)
     {
     echo 
    "Return Code: " $_FILES["file"]["error"] . "<br />";
     }
     else
     {
     echo 
    "Upload: " $_FILES["file"]["name"] . "<br />";
     echo 
    "Type: " $_FILES["file"]["type"] . "<br />";
     echo 
    "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
     echo 
    "Temp file: " $_FILES["file"]["tmp_name"] . "<br />";

     if (
    file_exists("upload/" $_FILES["file"]["name"]))
     {
     echo 
    $_FILES["file"]["name"] . " already exists. ";
     }
     else

     
    $mp3_name $_FILES["file"]["name"];
     
    $mp3_path "pload/$mp3_name";

     
    move_uploaded_file($_FILES["file"]["tmp_name"], $mp3_path);

     
    $sql "INSERT INTO 'music' SET name='$mp3_name', location'$mp3_path'";
     
    $result mysql_query($sql);
     if(
    $result)
     {
     echo 
    'MP3 Upload successfully';
     }
     else
     {
     echo 
    'ERROR: Upload Failed';
     }

     }
     }
     else
     {
     echo 
    "Invalid file";
     }
     
    ?>

  14. #14
    Join Date
    May 2014
    Posts
    30
    Hey guys trying to get this audio uploading script to work but I can't seem to get anything into the database. I think something may have gone awry with my variables perhaps. Could you possibly point out where I'm going wrong if you can see it that is. Feel like my brain is melting
    Thanks v.much as always

    [ php ]

    <!doctype html>

    <html lang="en">
    <head>
    <!--how browser interprets stuff-->
    <meta charset="utf-8" />
    <title>FXMAS</title>

    <link rel="stylesheet" href="main.css" />

    </head>
    <body>
    <div id="big_wrapper">

    <form enctype="multipart/form-data" action="upload.php" method="POST">
    File: <input type="file" name = "file"><br>
    <input type="submit" value="Upload">
    </form>



    <header id="main_header">

    <h1></h1>
    <h4></h4>
    </header>

    <nav id="menu">
    <form method="get" action="/search" id="search">
    <input name="q" type="text" size="40" placeholder="Search..." />
    </form>
    <ul>
    <li><a href="music.php">Music</li>
    <li><a href="fx.php">FX</li>
    <li><a href="upload.php">Upload</li>
    <li><a href="forum.php">Forum</li>
    <li><a href="reports.php">Reports</li>
    <li><a href="about.php">About</li>
    </ul>
    </nav>
    <section>
    <article>
    <header>
    <hgroup> <!--when you have more than one header-->
    <h1></h1>
    <h2></h2>
    </hgroup>
    </header>
    <p></p>
    <footer>
    <p>written by Jamie 2014</p>
    </footer>
    </article>

    <article>
    <header>
    <hgroup> <!--when you have more than one header-->
    <h1></h1>
    <h2></h2>
    </hgroup>
    </header>
    <p></p>
    <footer>
    <p></p>
    </footer>
    </article>
    </section>

    <aside>
    <h4></h4>

    </aside>
    <footer>

    </footer>
    </div>
    </body>
    </html>

    <?php

    // Connects to your Database
    mysql_connect("localhost", "root", "") or die(mysql_error()) ;
    mysql_select_db("mydb") or die(mysql_error()) ;




    if ((($_FILES["file"]["type"] == "audio/mp3")
    || ($_FILES["file"]["type"] == "audio/mp4")
    || ($_FILES["file"]["type"] == "audio/wav"))
    && ($_FILES["file"]["size"] < 1000000))
    {
    if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
    else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
    {
    echo $_FILES["file"]["name"] . " already exists. ";
    }
    else

    $mp3_name = $_FILES["file"]["name"];
    $mp3_path = "pload/$mp3_name";

    move_uploaded_file($_FILES["file"]["tmp_name"], $mp3_path);

    $sql = "INSERT INTO 'music' SET name='$mp3_name', location'$mp3_path'";
    $result = mysql_query($sql);
    if($result)
    {
    echo 'MP3 Upload successfully';
    }
    else
    {
    echo 'ERROR: Upload Failed';
    }

    }
    }
    else
    {
    echo "Invalid file";
    }
    ?>

    /php ]

  15. #15
    Join Date
    May 2014
    Posts
    77
    Try replacing the PHP file with this:

    PHP Code:
    <?php
     
    // Show the page as text instead of HTML. Can be helpful in debugging
     
    header('Content-Type:text/plain');

     
    // Enable debug error reporting
     
    if (true) {
      
    error_reporting(E_ALL);
      
    ini_set("display_errors"1);
     }
     
    print_r($_POST);
    echo 
    "\n-------\n"// \n = new line
     
    print_r($_FILES);

     
    // Connects to your Database 
     
    mysql_connect("localhost""root""") or die(mysql_error()) ; 
     
    mysql_select_db("mydb") or die(mysql_error()) ; 




     if (((
    $_FILES["file"]["type"] == "audio/mp3")
     || (
    $_FILES["file"]["type"] == "audio/mp4")
     || (
    $_FILES["file"]["type"] == "audio/wav"))
     && (
    $_FILES["file"]["size"] < 1000000))
     {
     if (
    $_FILES["file"]["error"] > 0)
     {
     echo 
    "Return Code: " $_FILES["file"]["error"] . "<br />";
     }
     else
     {
     echo 
    "Upload: " $_FILES["file"]["name"] . "<br />";
     echo 
    "Type: " $_FILES["file"]["type"] . "<br />";
     echo 
    "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
     echo 
    "Temp file: " $_FILES["file"]["tmp_name"] . "<br />";

     if (
    file_exists("upload/" $_FILES["file"]["name"]))
     {
     echo 
    $_FILES["file"]["name"] . " already exists. ";
     }
     else

     
    $mp3_name $_FILES["file"]["name"];
     
    $mp3_path "pload/$mp3_name";

     
    move_uploaded_file($_FILES["file"]["tmp_name"], $mp3_path);

     
    $sql "INSERT INTO 'music' SET name='$mp3_name', location'$mp3_path'";
     
    $result mysql_query($sql);
     if(
    $result)
     {
     echo 
    'MP3 Upload successfully';
     }
     else
     {
     echo 
    'ERROR: Upload Failed';
     }

     }
     }
     else
     {
     echo 
    "Invalid file";
     }
     
    ?>
    Paste the results here.

    Congrats on finally getting the PHP tags, it's appreciated and much easier to read.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles