Я работаю над этим весь день, и я просто не могу заставить его работать.
Я в основном получил простой запрос ajax, используя библиотеку jQuery, и я хочу отправить данные, которые я отправляю через вход файла mutlipart / form-data, однако я пробовал все, что я могу придумать.
Мой сценарий загрузки файлов находится в ожидании имени файла в качестве параметра (попробовал без него), но он просто не хочет получать данные из самого окна ввода файла.
Может кто-нибудь, пожалуйста, просветит меня о том, как это сделать без другого плагина (многократная загрузка и т. Д.).
Вот мой код jQuery для этого бита:
функция uploadTimesheets () {
$('#waiting').show(); var error = ''; var msg = ''; //Performs the Ajax Request var data = $.ajax({ type : 'POST', url : '/ajax/timesheet/uploadNewTimesheets.php', dataType : 'json', contentType : 'multipart/form-data', data : data, error : error, msg : msg, success : function(data){ if(!data){ $('#notification').removeClass(this).addClass('notification-success').html(data).show().delay(1200).fadeOut(800); getActiveTimesheets(getSelectedPage()); }else{ $('#notification').removeClass().addClass('notification-error').html(data.msg + data.errorList).show(); alert('PHHAIL'); } $('#waiting').hide(); function(xhr, status, errorThrown){ $('#waiting').hide(); } } });
}
И вот мой сценарий загрузки PHP:
/** * Creates a directory in the active directory with the given folder name * * @author RichardC * @param string $dirName * @return boolean */ public function createDir( $dirName ) { $docRoot = getenv('DOCUMENT_ROOT'); if (!is_dir(sprintf('%s/%s', $docRoot, $dirName))) { $makeDir = mkdir(sprintf('%s/%s', $docRoot, $dirName)); echo sprintf('Creating a folder called \'/%s/\' ...', $dirName); if ($makeDir) { echo '<br />Successfully created the folder.<br />'; return true; } else { echo sprintf('<br /> Sorry, please create the folder manually at: %s/%s', $docRoot, $dirName); return false; } } } /** * Uploads either a CSV or an EXCEL file to a temporary directory * * @author RichardC * @param Resource $file * @return Boolean true/false */ public function upload( $filename ) { $filename = (!isset($filename)) ? $this->file : $filename; //Get the document root $docRoot = getenv('DOCUMENT_ROOT'); $this->createDir('uploads'); if (($_FILES['file']['type'] == 'application/vnd.ms-excel') || ($_FILES['file']['type'] == 'application/csv') || ($_FILES['file']['type'] == 'text/csv') || ($_FILES['file']['type'] == 'text/comma-separated-values') || ($_FILES['file']['type'] == 'application/excel') && ($_FILES["file"]["size"] < 1000000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { if (file_exists($docRoot . "upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; $this->file = $docRoot . '/upload/' . $_FILES["file"]["name"]; } else { move_uploaded_file($_FILES["file"]["tmp_name"], $docRoot . "/upload/" . $_FILES["file"]["name"]); $this->file = $docRoot . '/upload/' . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; return false; } //Remove the unwanted file now $this->fileContents = file_get_contents($this->file); @unlink($this->file); unset($this->file); return true; }
с/** * Creates a directory in the active directory with the given folder name * * @author RichardC * @param string $dirName * @return boolean */ public function createDir( $dirName ) { $docRoot = getenv('DOCUMENT_ROOT'); if (!is_dir(sprintf('%s/%s', $docRoot, $dirName))) { $makeDir = mkdir(sprintf('%s/%s', $docRoot, $dirName)); echo sprintf('Creating a folder called \'/%s/\' ...', $dirName); if ($makeDir) { echo '<br />Successfully created the folder.<br />'; return true; } else { echo sprintf('<br /> Sorry, please create the folder manually at: %s/%s', $docRoot, $dirName); return false; } } } /** * Uploads either a CSV or an EXCEL file to a temporary directory * * @author RichardC * @param Resource $file * @return Boolean true/false */ public function upload( $filename ) { $filename = (!isset($filename)) ? $this->file : $filename; //Get the document root $docRoot = getenv('DOCUMENT_ROOT'); $this->createDir('uploads'); if (($_FILES['file']['type'] == 'application/vnd.ms-excel') || ($_FILES['file']['type'] == 'application/csv') || ($_FILES['file']['type'] == 'text/csv') || ($_FILES['file']['type'] == 'text/comma-separated-values') || ($_FILES['file']['type'] == 'application/excel') && ($_FILES["file"]["size"] < 1000000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { if (file_exists($docRoot . "upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; $this->file = $docRoot . '/upload/' . $_FILES["file"]["name"]; } else { move_uploaded_file($_FILES["file"]["tmp_name"], $docRoot . "/upload/" . $_FILES["file"]["name"]); $this->file = $docRoot . '/upload/' . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; return false; } //Remove the unwanted file now $this->fileContents = file_get_contents($this->file); @unlink($this->file); unset($this->file); return true; }
Если кто-то может помочь в этом, он будет очень признателен!
Чтобы сделать вашу работу multipart / formdata, вы должны добавить дополнительные данные в свой ajax-запрос:
cache: false, contentType: false, processData: false,
Вы можете легко создать поле данных, выполнив следующие действия:
var uploadData = $("#uploadFile").prop("files")[0]; var newData = new FormData(); $.each($('#uploadFile').prop("files"), function(i, file) { newData.append('file-'+i, file); });
в вашем ajax-запросе вам нужно будет установить это:
data: newData