使用 PHP 以未知文件名保存文件
Using PHP to save file with unknown file name
我正在进行一项在线实验(使用 jsPsych 库),其中参与者(每个人都有一个由脚本随机分配的代码)将记录许多 .wav 文件。然后我想上传到服务器,名称包括参与者的代码和与该记录关联的项目编号。每个参与者将创建大约 36 个不同的短 .wav 文件。
它看起来像 recorderjs 和 recordermp3.js are what I need to record the audio on the browser side (see RecorderJS uploading recorded blob via AJAX),但是 我很难找到我需要的信息来创建一个 PHP 脚本来保存一个未知文件的文件姓名.
这是相关的 javascript:
function stopRecording(subjectID, item_number) {
recorder && recorder.stop();
console.log('Stopped recording.');
recorder && recorder.exportWAV(function(blob) {
var xhr=new XMLHttpRequest();
xhr.onload=function(e) {
if(this.readyState === 4) {
console.log("Server returned: ",e.target.responseText);
}
};
var fd=new FormData();
fd.append(subjectID + item_number + ".wav", blob);
xhr.open("POST","upload_wav.php",true);
xhr.send(fd);
};
recorder.clear();
}
这是我目前为PHP所做的:
<?php
$target_dir = 'audio/';
$target_file=$target_dir . basename[$_FILES["fileToUpload"]["name"];
move_uploaded_file($_FILES[“fileToUpload”][“tmp_name”], $target_file);
chmod($target_file,0755);
?>
我的问题与Saving WAV File Recorded in Chrome to Server and HTML5 & getUserMedia - Record Audio & Save to Web Server after Certain Time非常相似
但不同之处在于我不知道上传文件的文件名是什么,我想使用 PHP (主要是因为我被告知要这样做)。我可以在 php 脚本中使用什么来代替 "fileToUpload" 来使该脚本适用于发送给它的任何 .wav 文件?
如果您还没有猜到我在上个月左右的时间里了解了关于 javascript 和 PHP 的所有知识,所以请对 n00b 保持温和。我查看了各种 PHP 教程和文档,但似乎没有找到我要找的东西。代码将不胜感激。
首先,您应该添加一些检查以确保您不会 post 被淹没。做到这一点的最小方法是确保 POST 来自同一服务器 IP(尽管有几种方法可以欺骗它):
if ($_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
http_response_code(403);
die('Forbidden');
}
此外,请确保仅在实际收到文件时才执行此脚本>
if (!$_FILES) {
http_response_code(400);
die('File missing');
}
关于您的文件名问题:您一次只上传一个文件,因此 $_FILES
将只有一个元素,您可以使用 current()
.
检索
$target_dir = 'audio/';
$file = current($_FILES);
$target_file = $target_dir . basename($file['name']);
move_uploaded_file($file['tmp_name'], $target_file);
// why would you do this?
chmod($target_file,0755);
我正在进行一项在线实验(使用 jsPsych 库),其中参与者(每个人都有一个由脚本随机分配的代码)将记录许多 .wav 文件。然后我想上传到服务器,名称包括参与者的代码和与该记录关联的项目编号。每个参与者将创建大约 36 个不同的短 .wav 文件。
它看起来像 recorderjs 和 recordermp3.js are what I need to record the audio on the browser side (see RecorderJS uploading recorded blob via AJAX),但是 我很难找到我需要的信息来创建一个 PHP 脚本来保存一个未知文件的文件姓名.
这是相关的 javascript:
function stopRecording(subjectID, item_number) {
recorder && recorder.stop();
console.log('Stopped recording.');
recorder && recorder.exportWAV(function(blob) {
var xhr=new XMLHttpRequest();
xhr.onload=function(e) {
if(this.readyState === 4) {
console.log("Server returned: ",e.target.responseText);
}
};
var fd=new FormData();
fd.append(subjectID + item_number + ".wav", blob);
xhr.open("POST","upload_wav.php",true);
xhr.send(fd);
};
recorder.clear();
}
这是我目前为PHP所做的:
<?php
$target_dir = 'audio/';
$target_file=$target_dir . basename[$_FILES["fileToUpload"]["name"];
move_uploaded_file($_FILES[“fileToUpload”][“tmp_name”], $target_file);
chmod($target_file,0755);
?>
我的问题与Saving WAV File Recorded in Chrome to Server and HTML5 & getUserMedia - Record Audio & Save to Web Server after Certain Time非常相似 但不同之处在于我不知道上传文件的文件名是什么,我想使用 PHP (主要是因为我被告知要这样做)。我可以在 php 脚本中使用什么来代替 "fileToUpload" 来使该脚本适用于发送给它的任何 .wav 文件?
如果您还没有猜到我在上个月左右的时间里了解了关于 javascript 和 PHP 的所有知识,所以请对 n00b 保持温和。我查看了各种 PHP 教程和文档,但似乎没有找到我要找的东西。代码将不胜感激。
首先,您应该添加一些检查以确保您不会 post 被淹没。做到这一点的最小方法是确保 POST 来自同一服务器 IP(尽管有几种方法可以欺骗它):
if ($_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
http_response_code(403);
die('Forbidden');
}
此外,请确保仅在实际收到文件时才执行此脚本>
if (!$_FILES) {
http_response_code(400);
die('File missing');
}
关于您的文件名问题:您一次只上传一个文件,因此 $_FILES
将只有一个元素,您可以使用 current()
.
$target_dir = 'audio/';
$file = current($_FILES);
$target_file = $target_dir . basename($file['name']);
move_uploaded_file($file['tmp_name'], $target_file);
// why would you do this?
chmod($target_file,0755);