Как отправить Blob типа octet / stream на сервер с помощью AJAX?
я безуспешно пытался отправить файл Blob (который является .Параметр obj тип файла) на сервер с помощью AJAX. Я хочу иметь возможность делать это без использования поля входного файла. Я создаю онлайн-аватар, поэтому файл Blob, который будет отправлен на сервер, генерируется из символа, который изначально импортирован в мои три.сцена js. Я смог отправить Blob-файл, содержащий строку, на сервер и сохранить его в указанную папку (что я и собираюсь сделать с Blob .OBJ file). Я попытался преобразовать Blob в Base64 перед отправкой его в POST-запрос, но это не сработало. Размер файла, который я пытаюсь отправить, составляет 3 МБ.
вот мой код JavaScript для создания файла Blob и отправки его в мой PHP-скрипт на сервере с помощью AJAX.
//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);
- это String и всякий раз, когда я печатаю эту переменную на консоль, для загрузки требуется несколько минут. Будет ли размер этой строки возможной проблемой при попытке отправить ее на сервер?
UPDATE 2: это печатается на консоль после выполнения PHP-скрипта, что заставляет меня думать, что либо ничего не отправляется на сервер, либо отправленные данные не обрабатываются правильно PHP-скриптом.
Изображение Загружено Успешно...!!
Имя:
тип:
размер: 0 КБ
файл Temp:
UPDATE 3: Вот ссылка на файл, который я пытаюсь отправить. http://www.filehosting.org/file/details/578744/CleanFemaleOBJ.obj
вы можете просмотреть этот файл в TextEdit / NotePad, чтобы просмотреть строку, которую я хочу отправить. Это в значительной степени текстовый файл с .расширение obj, чтобы преобразовать его в этот формат, чтобы его можно было открыть в Майе.
обновление 4: Теперь я изменил свой код JavaScript, чтобы Blob был добавлен к FormData, а не к результату чтения.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);
});
1 ответов
используя следующий код, я смог загрузить .
Я должен увеличить максимальный размер загрузки для его работы.
вы также можете подумать об увеличении максимального времени выполнения, как указано ниже, но мне это не нужно.
для простоты я поместил все в один файл под названием form.php
.
форма.в PHP
<?php
// good idea to turn on errors during development
error_reporting(E_ALL);
ini_set('display_errors', 1);
// ini_set('max_execution_time', 300);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
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>";
echo "<b>Error:</b> " . $_FILES["file"]["error"] . "<br>";
$sourcePath = $_FILES['file']['tmp_name']; // Storing source path of the file in a variable
$targetPath = "uploads/" . $_FILES['file']['name']; // Target path where file is to be stored
if (move_uploaded_file($sourcePath, $targetPath)) { // Moving Uploaded file
echo "<span id='success'>Image Uploaded Successfully...!!</span><br/>";
} else {
echo "<span id='success'>Image was not Uploaded</span><br/>";
}
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
</head>
<body>
<form action="form.php" method="post" enctype="multipart/form-data">
<label>File</label>
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
<div></div>
</body>
<script>
$(function () {
$('form').on('submit', function (e) {
e.preventDefault();
// logic
$.ajax({
url: this.action,
type: this.method,
data: new FormData(this), // important
processData: false, // important
contentType: false, // important
success: function (res) {
$('div').html(res);
}
});
});
});
</script>
</html>
Итак, сначала проверьте, можете ли вы загрузить используя код выше.
когда вы тестируете его, откройте инструмент разработчика Вашего браузера. Контролируйте вкладку Network/XHR [хром, в Firefox] чтобы увидеть запрос, который будет сделан при нажатии кнопки Загрузить.
если это работает, попробуйте использовать ту же логику в исходном коде.
var formData = new FormData();
formData.append('file', result);
$.ajax({
url: "ExecuteMaya.php",
type: "post",
data: formData, // important
processData: false, // important
contentType: false, // important!
success: function (res) {
console.log(res);
}
});
опять же, контролируйте запрос, сделанный на вкладке Network/XHR, и посмотрите, что отправляется.