PHP Bestanden uploaden

Status
Niet open voor verdere reacties.

MarcDelonghi

Gebruiker
Lid geworden
7 sep 2010
Berichten
29
Hallo,

Ik heb een klein probleem. Ik heb een recorder script op de website geplaatst welke automatisch de opname op de server opslaat. Echter wordt dit constant onder dezelfde naam opgeslagen, namelijk audio.wav. Ik wil graag mensen laten invullen hoe het bestand moet heten, dit op de beginpagina. Vervolgens moet dit dan de naam worden waaronder het bestand wordt opgeslagen op de server.

Dit is het formulier:

<form id="uploadForm" name="uploadForm" action="upload.php">
<p>
<input name="authenticity_token" value="xxxxx" type="hidden">
<input name="upload_file[parent_id]" value="Voer hier de gesproken tekst in" type="text"> <- dit moet dus de naam van het bestand zijn!
<input name="format" value="json" type="hidden">

Dit is het ondersteunend php script.

$key = 'filename';
$tmp_name = $_FILES["upload_file[parent_id]"]["tmp_name"][$key];
$upload_name = $_FILES["upload_file[parent_id]"]["name"][$key];
$type = $_FILES["upload_file[parent_id]"]["type"][$key];
$filename = "$save_folder/$upload_name";
$saved = 0;
if($type == 'audio/x-wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) {
$saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0;
}

if($_POST['format'] == 'json') {
header('Content-type: application/json');
print "{\"saved\":$saved}";
} else {
print $saved ? "Saved" : 'Not saved';
}

Kan iemand me hierbij helpen?
 
je moet aan de bestandsnaam een uniek nummer laten voegen.
UNIQID(MD5(MT_RAND()),true)
 
Welke regel moet ik deze dan toevoegen? Ik neem aan dat deze in het php script moet worden gevoerd, maar waar?
 
$parts_filename = explode('.',$upload_name);
$uni_key = UNIQID(MD5(MT_RAND()),true);
$parts_filename[0] = $parts_filename[0].$uni_key ;
$upload_name = implode('.',$parts_filename);
$filename = $save_folder/$upload_name;
 
Bedankt voor je code, maar hij werkt helaas niet.

Als je namelijk op www.voice2art.nl/bestel2.php kijkt zie je dat hij het audio bestand uiteindelijk niet opslaat..

Ik heb me echt al rot gezocht naar een goede code, maar helaas nog niks gevonden.
 
$upload_name = $_FILES["upload_file[parent_id]"]["name"][$key];
Dit is de naam van de ge-uploadde bestand.
Nu snap ik alleen niet wat die [$key] erachter doet.
doe anders eens echo $upload_name; om te zien hoe de naamsopbouw is.
en ook echo UNIQID(MD5(MT_RAND()),true); om te zien wat voor een key er aangemaakt wordt.

Ik ben er van uit gegaan dat de naam 'wave.wav' is. en ik heb $uni_key = UNIQID(MD5(MT_RAND()),true); ook niet getest.
 
Werkt dit?

$key = 'filename';
$tmp_name = $_FILES["upload_file[parent_id]"]["tmp_name"][$key];
$upload_name = $_FILES["upload_file[parent_id]"]["name"][$key];
$type = $_FILES["upload_file[parent_id]"]["type"][$key];

$uni_key = UNIQID(MD5(MT_RAND()),true);

$filename = "$save_folder/$uni_key"."$upload_name";
$saved = 0;
if($type == 'audio/x-wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) {
$saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0;
}

if($_POST['format'] == 'json') {
header('Content-type: application/json');
print "{\"saved\":$saved}";
} else {
print $saved ? "Saved" : 'Not saved';
}
 
Nee helaas niet..

Hoewel, hij hoeft ook niet een unieke code te hebben.
Het is ook voldoende als men gewoon kan invoeren wat de naam wordt..

Ik heb namelijk dit toegevoegd bij de html:

PHP:
<input type="text" name="new_name" />

Is dit makkelijker? Want nu hoeft er namelijk alleen maar ergens een verwijzing te komen in het php. Ik heb alleen geen idee waar..
 
Slaat ie het bestand uberhaubt op? Want ik heb het idee dat [$key] teveel is in de eerste paar regels?

Gaat dit beter? En zo niet, kan je eens error_reporting aanzetten door het volgende boven je script te zetten:
error_reporting(E_ALL);
ini_set('display_errors,1);

$tmp_name = $_FILES["upload_file[parent_id]"]["tmp_name"];
$upload_name = $_FILES["upload_file[parent_id]"]["name"];
$type = $_FILES["upload_file[parent_id]"]["type"];

$new_name = $_POST['new_name'];

$filename = $save_folder"/".$new_name;
$saved = 0;
if($type == 'audio/x-wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) {
$saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0;
}

if($_POST['format'] == 'json') {
header('Content-type: application/json');
print "{\"saved\":$saved}";
} else {
print $saved ? "Saved" : 'Not saved';
}
 
Ik heb de error_reporting aangezet, maar er veranderd niks..

De code die ik heb ziet er nu zo uit:

PHP:
<?
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);

$save_folder = dirname(__FILE__) . "/audio";
if(! file_exists($save_folder)) {
  if(! mkdir($save_folder)) {
    die("failed to create save folder $save_folder");
  }
 }

function valid_wav_file($file) {
  $handle = fopen($file, 'r');
  $header = fread($handle, 4);
  list($chunk_size) = array_values(unpack('V', fread($handle, 4)));
  $format = fread($handle, 4);
  fclose($handle);
  return $header == 'RIFF' && $format == 'WAVE' && $chunk_size == (filesize($file) - 8);
}

$tmp_name = $_FILES["upload_file[parent_id]"]["tmp_name"];
$upload_name = $_FILES["upload_file[parent_id]"]["name"];
$type = $_FILES["upload_file[parent_id]"]["type"];

$new_name = $_POST['new_name'];

$filename = $save_folder/$new_name;
$saved = 0;
if($type == 'audio/x-wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) {
$saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0;
}

if($_POST['format'] == 'json') {
header('Content-type: application/json');
print "{\"saved\":$saved}";
} else {
print $saved ? "Saved" : 'Not saved';
} 
?>

Als ik de originele php gebruik, dan slaat hij het bestand wel op. Maar dan als Audio.wav, dus bestanden worden dan overschreven..
 
Dan moeten we dus even vanaf het bestaande script gaan kijken. De code uit je eerste bericht dus.

Code:
$key = 'filename';
$tmp_name = $_FILES["upload_file[parent_id]"]["tmp_name"][$key];
$upload_name = $_FILES["upload_file[parent_id]"]["name"][$key];
$type = $_FILES["upload_file[parent_id]"]["type"][$key];
$filename = "$save_folder/$upload_name";
$saved = 0;
if($type == 'audio/x-wav' && preg_match('/^[a-zA-Z0-9_\-]+\.wav$/', $upload_name) && valid_wav_file($tmp_name)) {
$saved = move_uploaded_file($tmp_name, $filename) ? 1 : 0;
}

if($_POST['format'] == 'json') {
header('Content-type: application/json');
print "{\"saved\":$saved}";
} else {
print $saved ? "Saved" : 'Not saved';
}

Als je wilt dat de waarde uit jouw formulier fomulier uit het new_name-input field de nieuwe bestandsnaam wordt, moet je deze regel

$filename = "$save_folder/$upload_name";

vervangen met

$filename = $save_folder."/".$_POST['new_name'];
 
En de html ziet dan zo uit toch?

PHP:
<form id="uploadForm" name="uploadForm" action="upload.php">
    <p>
      <input name="authenticity_token" value="xxxxx" type="hidden">
      <input name="upload_file[parent_id]" value="1" type="hidden">
      <input name="format" value="json" type="hidden">   
      <p>Geef hier een referentie op:
        <input type="text" name="new_name" /> 
      </form>
 
Jups. Dat zou moeten werken als de code die jij hebt geplakt in je opening-post ook werkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan