使用 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);