【发布时间】:2015-07-22 00:58:50
【问题描述】:
我参与了一项关于亚马逊 Mechanical Turk 的心理语言规范研究,参与者看到一张图片,然后大声说出它的名字。他们的声音是通过 HTML5 的录音功能录制的,然后录音上传到服务器。有三个相关文件:显示外部问题的 php 文件(external_question.php)、处理所有 javascript 的 js 文件(controller.js)和接受文件上传的 php 文件(accept_upload.php)。
external_question.php为实时服务器设置:
<form id="question_form" name="question_form" action="https://www.mturk.com/mturk/externalSubmit" method="post">
external_question.php为沙箱服务器设置:
<form id="question_form" name="question_form" action="https://workersandbox.mturk.com/mturk/externalSubmit" method="post">
现在,出于某种奇怪的原因,每当我使用实时服务器时,finalizeRecording() 在控制台中打印的响应是来自accept_upload 的响应,它读取 responseText:"", status:0, statusText:"error" . (请参阅下面的函数和文件。)基本上,什么都不会返回。
但是,当我使用沙盒服务器时,一切正常。文件已上传,我的回复看起来很正常:
readyState: 4, responseText: "页面进入。
<pre>音频文件成功处理...↵ [size] => 540716↵)↵↵)↵</pre>", status: 200, statusText: "OK"
我被难住了!当我将表单提交到一个 URL 时,什么可能导致我的 Ajax 请求完全失败,但当我提交到另一个 URL 时却可以正常工作?
相关文件和函数
controller.js(相关函数)
function finalizeRecording( blob ) {
var myFormData = new FormData();
myFormData.append('audioFile', blob, 'rec_' + workerId + '_' + stimulusName + '_' + assignmentId + '.wav');
$.ajax({
url: 'accept_upload.php',
type: 'POST',
processData: false, // important
contentType: false, // important
dataType : 'json',
data: myFormData,
complete: function(result) {
console.log(result);
$('form').trigger('submit');
}
});;
}
accept_upload.php(整个文件)
<?php
echo "Page entered.";
$uploadDir = '../../WHEREVER/WHEREVER/';
chmod('uploads/', 0777);
$uploadFile = $uploadDir . basename($_FILES['audioFile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['audioFile']['tmp_name'], $uploadFile)) {
echo "Audio file successfully processed\n";
} else {
echo "Audio file processing attempt unsuccessful\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
【问题讨论】:
-
使用 dataType json 但返回文本没有意义
-
你是对的,我不知道为什么会这样。但这不会对未连接的请求产生影响。
标签: javascript jquery ajax xmlhttprequest mechanicalturk