我正在开展一项在线实验(使用 jsPsych 库),参与者(每个参与者都有一个由脚本随机分配的代码)将录制许多 .wav 文件。然后,我想上传到服务器,其名称包括参与者的代码号和与该记录关联的项目号。每个参与者将创建类似 36 个不同的短 .wav 文件。
它看起来像 recorderjs 和 recordermp3.js是我在浏览器端录制音频所需的内容(请参阅 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 非常相似和 HTML5 & getUserMedia - Record Audio & Save to Web Server after Certain Time 但不同之处在于我不知道上传文件的文件名是什么,并且我想使用 PHP(主要是因为有人告诉我这样做)。我可以使用什么来代替 php 脚本中的“fileToUpload”,以使该脚本适用于发送给它的任何 .wav 文件?
如果您还没有猜到我在上个月左右的时间里已经学会了有关 javascript 和 PHP 的所有知识,所以请对 n00b 保持温柔。我查看了各种 PHP 教程和文档,但似乎没有找到我想要的东西。代码将不胜感激。
最佳答案
首先,您应该添加一些检查以确保您不会被帖子淹没。做到这一点的最小方法是确保 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);
关于javascript - 使用PHP保存未知文件名的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45621135/