1

我正在做一个在线实验(使用 jsPsych 库),参与者(每个人都有一个由脚本随机分配的代码)将记录一些 .wav 文件。然后,我想将包含参与者代码和与该记录关联的项目编号的名称上传到服务器。每个参与者将创建类似 36 个不同的短 .wav 文件。

看起来 recorderjs 和recordermp3.js是我在浏览器端录制音频所需的(请参阅RecorderJS 通过 AJAX 上传录制的 blob),但我很难找到创建 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);
?>

我的问题与将Chrome 中录制的 WAV 文件保存到服务器HTML5 和 getUserMedia - 录制音频并在特定时间后保存到 Web 服务器非常相似, 但不同之处在于我不知道上传文件的文件名是什么,我想要使用 PHP(主要是因为有人告诉我)。我可以在 php 脚本中使用什么来代替“fileToUpload”来让该脚本适用于发送给它的任何 .wav 文件?

如果您还没有猜到,我在上个月左右学习了有关 javascript 和 PHP 的所有知识,所以请对 n00b 保持温和。我查看了各种 PHP 教程和文档,但似乎并没有找到我想要的东西。代码将不胜感激。

4

1 回答 1

0

首先,您应该添加一些检查以确保您不会被帖子淹没。做到这一点的最小方法是确保 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);
于 2017-08-10T21:56:34.530 回答