【发布时间】:2016-10-19 02:23:50
【问题描述】:
我尝试使用 AJAX 向服务器发送 Blob 文件(.OBJ 文件类型)失败。我希望能够在不使用输入文件字段的情况下做到这一点。我正在制作一个在线头像创建者,因此要发送到服务器的 Blob 文件是从最初导入到我的 Three.js 场景中的角色生成的。我已经能够将包含字符串的 Blob 文件发送到服务器并将其保存到指定的文件夹(我的目标是使用 Blob .OBJ 文件)。在将 Blob 发送到 POST 请求中之前,我曾尝试将其转换为 Base64,但这不起作用。我尝试发送的文件大小为 3MB。
这是我的 JavaScript 代码,用于创建 Blob 文件并使用 AJAX 将其发送到服务器上的 PHP 脚本。
//Create OBJ
var exporter = new THREE.OBJExporter();
var result = exporter.parse(child);
//Generate file to send to server
var formData = new FormData();
var characterBlob = new Blob([result], {type: "octet/stream"});
var reader = new FileReader();
reader.readAsDataURL(characterBlob);
reader.onloadend = function() {
formData.append('file', reader.result);
$.ajax({
url: "ExecuteMaya.php", // Url to which the request is send
type: "POST", // Type of request to be send, called as method
data: formData, // Data sent to server, a set of key/value pairs (i.e. form fields and values)
processData:false, // To send DOMDocument or non processed data file it is set to false
contentType: false, // The content type used when sending data to the server
}).done(function(data) {
console.log(data);
});
}
这是我处理发送文件的 PHP 脚本。
<?php
$sourcePath = $_FILES['file']['tmp_name']; // Storing source path of the file in a variable
$targetPath = "upload/".$_FILES['file']['name']; // Target path where file is to be stored
move_uploaded_file($sourcePath,$targetPath) ; // Moving Uploaded file
echo "<span id='success'>Image Uploaded Successfully...!!</span><br/>";
echo "<br/><b>File Name:</b> " . $_FILES["file"]["name"] . "<br>";
echo "<b>Type:</b> " . $_FILES["file"]["type"] . "<br>";
echo "<b>Size:</b> " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "<b>Temp file:</b> " . $_FILES["file"]["tmp_name"] . "<br>";
?>
任何帮助将不胜感激!
更新 1:var result = exporter.parse(child); 是一个字符串,每当我将此变量打印到控制台时,都需要几分钟才能加载。尝试将其发送到服务器时,此字符串的大小是否会成为问题?
更新 2:在执行 PHP 脚本后,这会打印到控制台,这让我认为要么没有任何东西被发送到服务器,要么 PHP 脚本没有正确处理发送的数据。
图片上传成功...!!
文件名:
类型:
大小: 0 kB
临时文件:
更新 3:这是我要发送的文件的链接。 http://www.filehosting.org/file/details/578744/CleanFemaleOBJ.obj
您可以在 TextEdit/NotePad 中查看此文件以查看我要发送的字符串。它几乎是一个带有 .obj 扩展名的文本文件,可以将其转换为该格式,以便可以在 Maya 中打开。
更新 4:我现在更改了我的 JavaScript 代码,以便将 Blob 附加到 FormData 而不是 reader.readAsDataURL(characterBlob) 的结果。
//Create OBJ
var exporter = new THREE.OBJExporter();
var result = exporter.parse(child);
//Generate file to send to server
var formData = new FormData();
var characterBlob = new Blob([result], {type: "octet/stream"});
formData.append('file', result);
$.ajax({
url: "ExecuteMaya.php", // Url to which the request is send
type: "POST", // Type of request to be send, called as method
data: formData, // Data sent to server, a set of key/value pairs (i.e. form fields and values)
processData: false, // To send DOMDocument or non processed data file it is set to false
}).done(function(data) {
console.log(data);
});
【问题讨论】:
-
reader.result是数据 uri 而不是 blob/文件,您应该发送characterBlob代替 -
@Musa 我最初尝试发送 characterBlob 但这不起作用。每当我发送 characterBlob 时,我都会在控制台中收到一条消息,说它已成功发送,但我将 Blob 文件保存到的文件夹中没有出现任何文件。
-
@Musa 你知道如何解决这个问题吗?
-
也打印出
$_FILES["file"]["error"]。它返回什么value?如果字符串不太长,请使用显示的字符串编辑您的帖子(更新 1)。 -
@Mikey 我没有得到 $_FILES["file"]["error"] 的返回值,就像我尝试回显有关文件的其他信息时一样。我的 PHP 脚本不正确吗?我现在已经更新了我的问题以包含指向 .OBJ 文件的链接,谢谢。
标签: javascript php jquery ajax blob