hummingbird
@hummingbird

Как правильно настроить jQuery File Upload?

Здравствуйте!

Пытаюсь настроить загрузчик файлов "jQuery File Upload". Отображение на странице вроде настроил - выборка, старт загрузки и отмена функционируют.

Код формы:
<form id="fileupload" action="upload.php" method="POST" enctype="multipart/form-data">
	<!-- Redirect browsers with JavaScript disabled to the origin page -->
	<noscript><input type="hidden" name="redirect" value="https://blueimp.github.io/jQuery-File-Upload/"></noscript>
	<!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
	<div class="row fileupload-buttonbar">
		<div class="col-lg-7">
			<!-- The fileinput-button span is used to style the file input field as button -->
			<span class="btn btn-success fileinput-button">
				<i class="glyphicon glyphicon-plus"></i>
				<span>Add files...</span>
				<input id="fileupload" type="file" name="files[]" multiple data-url="/path/to/upload/handler.json" data-sequential-uploads="true" data-form-data='{"script": "true"}'>
			</span>
			<button type="submit" class="btn btn-primary start">
				<i class="glyphicon glyphicon-upload"></i>
				<span>Start upload</span>
			</button>
			<button type="reset" class="btn btn-warning cancel">
				<i class="glyphicon glyphicon-ban-circle"></i>
				<span>Cancel upload</span>
				</button>
			<button type="button" class="btn btn-danger delete">
				<i class="glyphicon glyphicon-trash"></i>
				<span>Delete</span>
			</button>
			<input type="checkbox" class="toggle">
			<!-- The global file processing state -->
			<span class="fileupload-process"></span>
		</div>
		<!-- The global progress state -->
		<div class="col-lg-5 fileupload-progress fade">
			<!-- The global progress bar -->
			<div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
				<div class="progress-bar progress-bar-success" style="width:0%;"></div>
			</div>
			<!-- The extended global progress state -->
			<div class="progress-extended">&nbsp;</div>
		</div>
	</div>
	<!-- The table listing the files available for upload/download -->
	<table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
</form>

<!-- The blueimp Gallery widget -->
<div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even">
	<div class="slides"></div>
	<h3 class="title"></h3>
	<a class="prev">‹</a>
	<a class="next">›</a>
	<a class="close">×</a>
	<a class="play-pause"></a>
	<ol class="indicator"></ol>
</div>
<!-- The template to display files available for upload -->
<script id="template-upload" type="text/x-tmpl">
	{% for (var i=0, file; file=o.files[i]; i++) { %}
		<tr class="template-upload fade">
			<td>
				<span class="preview"></span>
			</td>
			<td>
				<p class="name">{%=file.name%}</p>
				<strong class="error text-danger"></strong>
			</td>
			<td>
				<p class="size">Processing...</p>
				<div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
			</td>
			<td>
				{% if (!i && !o.options.autoUpload) { %}
					<button class="btn btn-primary start" disabled>
						<i class="glyphicon glyphicon-upload"></i>
						<span>Start</span>
					</button>
				{% } %}
				{% if (!i) { %}
					<button class="btn btn-warning cancel">
						<i class="glyphicon glyphicon-ban-circle"></i>
						<span>Cancel</span>
					</button>
				{% } %}
			</td>
		</tr>
	{% } %}
</script>
<!-- The template to display files available for download -->
<script id="template-download" type="text/x-tmpl">
	{% for (var i=0, file; file=o.files[i]; i++) { %}
		<tr class="template-download fade">
			<td>
				<span class="preview">
					{% if (file.thumbnailUrl) { %}
						<a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
					{% } %}
				</span>
			</td>
			<td>
				<p class="name">
					{% if (file.url) { %}
						<a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
					{% } else { %}
						<span>{%=file.name%}</span>
					{% } %}
				</p>
				{% if (file.error) { %}
					<div><span class="label label-danger">Error</span> {%=file.error%}</div>
				{% } %}
			</td>
			<td>
				<span class="size">{%=o.formatFileSize(file.size)%}</span>
			</td>
			<td>
				{% if (file.deleteUrl) { %}
					<button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
						<i class="glyphicon glyphicon-trash"></i>
						<span>Delete</span>
					</button>
					<input type="checkbox" name="delete" value="1" class="toggle">
				{% } else { %}
					<button class="btn btn-warning cancel">
						<i class="glyphicon glyphicon-ban-circle"></i>
						<span>Cancel</span>
					</button>
				{% } %}
			</td>
		</tr>
	{% } %}
</script>


Инициализируем форму:
<script type="text/javascript">
	$('#fileupload').fileupload();
</script>


NYWL.png
NYWM.png

На скриншотах видно, что файлы добавляются, а по нажатию на кнопку "Start upload" запускается обработчик.

Код обработчика:
define ( 'ROOT_DIR', substr( dirname(  __FILE__ ), 0, -21 ) );

error_reporting(E_ALL | E_STRICT);

require_once ROOT_DIR . '/UploadHandler.php';

echo "good";
// echo $_FILES['files'];

$upload_handler = new UploadHandler(array(
	'accept_file_types' => '/\.(gif|jpe?g|png)$/i'
));


Что делать дальше не могу понять. На официальном сайте нет конкретных примеров. В репозитории на гитхабе в тестах тоже ничего не понял...

А не могу я понять конкретно содержание обработчика: как формировать необходимый json ответ и так далее...

Надеюсь на вашу помощь...
  • Вопрос задан
  • 11174 просмотра
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Изучайте UploadHandler.php
Там довольно понятный код

Ответ он сам генерирует какой нужно.
Вы можете легко вписаться в его работу, для выполнения нужных действий.
Я например при загрузке файла в UploadHandler сделал запись информации о файлах в сессию пользователя. И при сохранении поста(запись в блоге) брал список файлов из сессии и прикреплял к посту нужные файлы.

Сделать это можно в функции post в UploadHandler
Так же надо не забывать что файл можно моментально удалить,в функции delete нужно очищать сессию от удаленного файла.
Ответ написан
Комментировать
done:  function(e, data){
			data.context.removeClass('working');
			response = data.jqXHR.responseJSON;
			if (response.status == "error"){
				data.context.addClass('error');
				data.context.append('<i class="msg">'+response.msg+'</i>');
			}
			else{
				data.context.append('<i class="msg">Фото загружено</i>');
				data.context.append('<img src="'+response.msg+'"</img>');
			}
        },


def upload
		response = {:status => nil, :msg => nil}
		begin
			if current_user.attachments.count>=10
				raise UserException, "Превышено максимальное количество файлов."
			end
			attach = Attachment.new
			attach.pic = params[:file]
			attach.user = current_user
			attach.save!
			if attach.errors.empty?
				response[:status]="success"
				response[:msg] = attach.pic.thumb.url
				render json: JSON.generate(response)
			else
				raise UserException, "Фото не добавлено."
			end
		rescue UserException => e
			response[:status] = "error"
			response[:msg] = e.message
			render json: JSON.generate(response)
		rescue Exception => e
			response[:status] = "error"
			response[:msg] = "Фатальная ошибка. "
			response[:msg] << e.message if Rails.env.development?
			render json: JSON.generate(response)
		rescue
			response[:status] = "error"
			response[:msg] = "Фатальная ошибка."
			render json: JSON.generate(response)	
		end
	end
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы