[jquery] 누군가 jQuery 파일 업로드 플러그인을 구현하는 방법을 설명 할 수 있습니까?
수정 (2019 년 10 월) :
6 년이 지난 지금도 jQuery 파일 업로드는 여전히 사람들을 미치게 만들고 있습니다. 여기에 대한 답변에서 약간의 위안을 찾고 있다면 NPM 에서 현대적인 대안을 찾아 보십시오 . 번거로울 가치가 없습니다. 약속합니다.
이전 편집에서 Uploadify를 권장했지만 댓글 작성자가 지적했듯이 더 이상 무료 버전을 제공하지 않는 것 같습니다. Uploadify이었다 그래서 어쨌든 2013.
편집하다:
여전히 교통 체증이있는 것 같아서 제가 뭘했는지 설명하겠습니다. 결국 수락 된 답변의 자습서를 따라 플러그인이 작동했습니다. 그러나 jQuery 파일 업로드는 정말 번거롭고 더 간단한 파일 업로드 플러그인을 찾고 있다면 Uploadify를 적극 권장 합니다. 답변에서 지적했듯이 비상업적 용도로만 무료입니다.
배경
사용자가 파일을 업로드 할 수 있도록 blueimp의 jQuery 파일 업로드 를 사용하려고 합니다. 기본적으로 설정 지침에 따라 완벽하게 작동합니다 . 하지만 내 웹 사이트에서 실제로 사용하기 위해 몇 가지 작업을 수행 할 수 있기를 원합니다.
- 내 기존 페이지에 업 로더 포함
- 업로드 된 파일의 디렉토리 변경
플러그인의 모든 파일은 루트 아래의 폴더에 있습니다.
난 노력 했어…
- 데모 페이지를 루트로 이동하고 필요한 스크립트에 대한 경로 업데이트
- 여기에 제안 된대로 UploadHandler.php 파일에서 ‘upload_dir’및 ‘upload_url’옵션을 변경합니다 .
- 데모 자바 스크립트의 두 번째 줄에서 URL 변경
모든 경우에 미리보기가 표시되고 진행률 표시 줄이 실행되지만 파일이 업로드되지 않고 콘솔에 다음 오류가 표시됩니다 Uncaught TypeError: Cannot read property 'files' of undefined
.. 플러그인의 모든 부분이 어떻게 작동하는지 이해하지 못해 디버깅이 어렵습니다.
암호
데모 페이지의 자바 스크립트 :
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = 'file_upload/server/php/UploadHandler.php',
uploadButton = $('<button/>')
.addClass('btn')
.prop('disabled', true)
.text('Processing...')
.on('click', function () {
var $this = $(this),
data = $this.data();
$this
.off('click')
.text('Abort')
.on('click', function () {
$this.remove();
data.abort();
});
data.submit().always(function () {
$this.remove();
});
});
$('#fileupload').fileupload({
url: url,
dataType: 'json',
autoUpload: false,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
maxFileSize: 5000000, // 5 MB
// Enable image resizing, except for Android and Opera,
// which actually support image resizing, but fail to
// send Blob objects via XHR requests:
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
previewMaxWidth: 100,
previewMaxHeight: 100,
previewCrop: true
}).on('fileuploadadd', function (e, data) {
data.context = $('<div/>').appendTo('#files');
$.each(data.files, function (index, file) {
var node = $('<p/>')
.append($('<span/>').text(file.name));
if (!index) {
node
.append('<br>')
.append(uploadButton.clone(true).data(data));
}
node.appendTo(data.context);
});
}).on('fileuploadprocessalways', function (e, data) {
var index = data.index,
file = data.files[index],
node = $(data.context.children()[index]);
if (file.preview) {
node
.prepend('<br>')
.prepend(file.preview);
}
if (file.error) {
node
.append('<br>')
.append(file.error);
}
if (index + 1 === data.files.length) {
data.context.find('button')
.text('Upload')
.prop('disabled', !!data.files.error);
}
}).on('fileuploadprogressall', function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .bar').css(
'width',
progress + '%'
);
}).on('fileuploaddone', function (e, data) {
$.each(data.result.files, function (index, file) {
var link = $('<a>')
.attr('target', '_blank')
.prop('href', file.url);
$(data.context.children()[index])
.wrap(link);
});
}).on('fileuploadfail', function (e, data) {
$.each(data.result.files, function (index, file) {
var error = $('<span/>').text(file.error);
$(data.context.children()[index])
.append('<br>')
.append(error);
});
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
나는 문서의 부족에 놀랐다. 변경하는 것은 간단해야 할 것 같습니다. 누군가이 방법을 설명해 주시면 감사하겠습니다.
답변
며칠 전에 비슷한 기능을 찾고 있었고 tutorialzine에 대한 좋은 자습서를 보았습니다. 다음은 작동하는 예입니다. 전체 자습서는 여기 에서 찾을 수 있습니다 .
파일 업로드 대화 상자를 보관하는 간단한 형식 :
<form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="uploadctl" multiple />
<ul id="fileList">
<!-- The file list will be shown here -->
</ul>
</form>
다음은 파일을 업로드하는 jQuery 코드입니다.
$('#upload').fileupload({
// This function is called when a file is added to the queue
add: function (e, data) {
//This area will contain file list and progress information.
var tpl = $('<li class="working">'+
'<input type="text" value="0" data-width="48" data-height="48" data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" />'+
'<p></p><span></span></li>' );
// Append the file name and file size
tpl.find('p').text(data.files[0].name)
.append('<i>' + formatFileSize(data.files[0].size) + '</i>');
// Add the HTML to the UL element
data.context = tpl.appendTo(ul);
// Initialize the knob plugin. This part can be ignored, if you are showing progress in some other way.
tpl.find('input').knob();
// Listen for clicks on the cancel icon
tpl.find('span').click(function(){
if(tpl.hasClass('working')){
jqXHR.abort();
}
tpl.fadeOut(function(){
tpl.remove();
});
});
// Automatically upload the file once it is added to the queue
var jqXHR = data.submit();
},
progress: function(e, data){
// Calculate the completion percentage of the upload
var progress = parseInt(data.loaded / data.total * 100, 10);
// Update the hidden input field and trigger a change
// so that the jQuery knob plugin knows to update the dial
data.context.find('input').val(progress).change();
if(progress == 100){
data.context.removeClass('working');
}
}
});
//Helper function for calculation of progress
function formatFileSize(bytes) {
if (typeof bytes !== 'number') {
return '';
}
if (bytes >= 1000000000) {
return (bytes / 1000000000).toFixed(2) + ' GB';
}
if (bytes >= 1000000) {
return (bytes / 1000000).toFixed(2) + ' MB';
}
return (bytes / 1000).toFixed(2) + ' KB';
}
다음은 데이터를 처리하는 PHP 코드 샘플입니다.
if($_POST) {
$allowed = array('jpg', 'jpeg');
if(isset($_FILES['uploadctl']) && $_FILES['uploadctl']['error'] == 0){
$extension = pathinfo($_FILES['uploadctl']['name'], PATHINFO_EXTENSION);
if(!in_array(strtolower($extension), $allowed)){
echo '{"status":"error"}';
exit;
}
if(move_uploaded_file($_FILES['uploadctl']['tmp_name'], "/yourpath/." . $extension)){
echo '{"status":"success"}';
exit;
}
echo '{"status":"error"}';
}
exit();
}
위의 코드는 기존 양식에 추가 할 수 있습니다. 이 프로그램은 이미지가 추가되면 자동으로 업로드합니다. 이 기능은 변경 될 수 있으며 기존 양식을 제출하는 동안 이미지를 제출할 수 있습니다.
실제 코드로 내 대답을 업데이트했습니다. 모든 크레딧은 코드의 원저자에게 있습니다.
출처 :
http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/
답변
저는 jQuery 업로드와 싸우는 데 2 시간을 보냈지 만 종속성의 양 때문에 포기했습니다.
좀 더 검색을했고 종속성이없는 Dropzone.js 라는 깔끔한 프로젝트를 발견했습니다 .
저자는 또한 jQuery 파일 업로드 플러그인에서 영감을 얻은 부트 스트랩 데모 를 만들었습니다 .
나는 이것이 다른 누군가의 시간을 절약하기를 바랍니다.
답변
나는 또한 이것으로 어려움을 겪었지만 UploadHandler.php에서 경로가 어떻게 작동하는지 알아 냈을 때 작동하게되었습니다. upload_dir 및 upload_url은 작동하도록하는 유일한 설정에 관한 것입니다. 또한 서버 오류 로그에서 디버깅 정보를 확인하십시오.
답변
dropper jquery 플러그인을 사용하여 이미지 미리보기가있는 이미지 드래그 앤 드롭 업 로더를 확인하세요.
HTML
<div class="target" width="78" height="100"><img /></div>
JS
$(".target").dropper({
action: "upload.php",
}).on("start.dropper", onStart);
function onStart(e, files){
console.log(files[0]);
image_preview(files[0].file).then(function(res){
$('.dropper-dropzone').empty();
//$('.dropper-dropzone').css("background-image",res.data);
$('#imgPreview').remove();
$('.dropper-dropzone').append('<img id="imgPreview"/><span style="display:none">Drag and drop files or click to select</span>');
var widthImg=$('.dropper-dropzone').attr('width');
$('#imgPreview').attr({width:widthImg});
$('#imgPreview').attr({src:res.data});
})
}
function image_preview(file){
var def = new $.Deferred();
var imgURL = '';
if (file.type.match('image.*')) {
//create object url support
var URL = window.URL || window.webkitURL;
if (URL !== undefined) {
imgURL = URL.createObjectURL(file);
URL.revokeObjectURL(file);
def.resolve({status: 200, message: 'OK', data:imgURL, error: {}});
}
//file reader support
else if(window.File && window.FileReader)
{
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = function () {
imgURL = reader.result;
def.resolve({status: 200, message: 'OK', data:imgURL, error: {}});
}
}
else {
def.reject({status: 1001, message: 'File uploader not supported', data:imgURL, error: {}});
}
}
else
def.reject({status: 1002, message: 'File type not supported', error: {}});
return def.promise();
}
$('.dropper-dropzone').mouseenter(function() {
$( '.dropper-dropzone>span' ).css("display", "block");
});
$('.dropper-dropzone').mouseleave(function() {
$( '.dropper-dropzone>span' ).css("display", "none");
});
CSS
.dropper-dropzone{
width:78px;
padding:3px;
height:100px;
position: relative;
}
.dropper-dropzone>img{
width:78px;
height:100px;
margin-top=0;
}
.dropper-dropzone>span {
position: absolute;
right: 10px;
top: 20px;
color:#ccc;
}
.dropper .dropper-dropzone{
padding:3px !important
}
답변
이것은 파일 업로드를위한 좋은 Angular 플러그인이며 무료입니다!
답변
나는 Rails에서 잠시 동안이 플러그인으로 고생 한 후 누군가 내가 만든 모든 코드를 쓸모 없게 만들었습니다.
Rails에서 이것을 사용하지 않는 것처럼 보이지만 누군가 사용하고 있다면 this gem을 확인하십시오 . 소스는 여기에 있습니다-> jQueryFileUpload Rails .
최신 정보:
댓글 작성자를 만족시키기 위해 내 답변을 업데이트했습니다. 본질적으로 ” use this gem , 여기에 소스 코드가 있습니다. “만약 그것이 사라지면 먼 길을 가십시오.
답변
안녕하세요 벨로우즈 링크를 시도해보십시오. 나는 오랫동안 갇혀 있었고 몇 분 안에 문제를 해결했습니다.
http://simpleupload.michaelcbrook.com/#examples