The issue is I can't upload file to the folder but the file name is storing in DB. I am getting an image if I copy and paste an image to the folder but I can't able to upload while update or add an image.
I not good in jQuery. Also, this project using Jquery.file upload plugin which I really don't know.
product-edit.php
<div class="col-sm-6">
<table id="files" class="files">
<tr>
<td>
<div class="col-sm-12 text-center">
<img style="width: 300px; height: 200px;" src="<?= base_url() ?>userfiles/product/<?php echo $product['image'] . '?c=' . rand(1, 9999) ?>"/>
</div>
<div class="col-sm-12 my-2" > <?php echo $product['image'] ?> </div>
<div class="col-sm-12 my-2" >
<a class="btn-danger btn-sm px-1 " data-url="<?= base_url() ?>products/file_handling?op=delete&name=<?php echo $product['image'] ?>" class="aj_delete">
<i class="fa fa-trash mx-1 "></i>Delete Image</a>
</div>
</td>
</tr>
</table>
</div>
<div class="col-sm-6">
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span class="my-2">Select files...</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="files[]">
</span>
<div class="my-1">
<q>Allowed: gif, jpeg, png</q>
</div>
<!-- The global progress bar -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
</div>
</div>
jQuery
<script src="<?php echo assets_url('assets/myjs/jquery.ui.widget.js'); $invoice['tid'] = 0; ?>"></script>
<script src="<?php echo assets_url('assets/myjs/jquery.fileupload.js') ?>"></script>
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = '<?php echo base_url() ?>products/file_handling?id=<?php echo $product['pid'] ?>';
$('#fileupload').fileupload({
url: url,
dataType: 'json',
formData: {'<?=$this->security->get_csrf_token_name()?>': crsf_hash},
done: function (e, data) {
var img = 'default.png';
$.each(data.result.files, function (index, file) {
$('#files').html('<tr><td><a data-url="<?php echo base_url() ?>products/file_handling?op=delete&name=' + file.name + '" class="aj_delete"><i class="btn-danger btn-sm icon-trash-a"></i> ' + file.name + ' </a><img style="max-height:200px;" src="<?php echo base_url() ?>userfiles/product/' + file.name + '"></td></tr>');
img = file.name;
});
$('#image').val(img);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
Here the controller method for upload file to the folder
Products.php
public function file_handling()
{
if ($this->input->get('op')) {
$name = $this->input->get('name');
if ($this->products->meta_delete($name)) {
echo json_encode(array('status' => 'Success'));
}
} else {
$id = $this->input->get('id');
$this->load->library("Uploadhandler_generic", array(
'accept_file_types' => '/\.(gif|jpe?g|png)$/i', 'max_file_size' => 2048, 'upload_dir' => FCPATH . 'userfiles/product/', 'upload_url' => base_url() . 'userfiles/product/'
));
}
}
The problem is you are loading the upload library config but are not actually processing the upload.
After this, which loads the upload library wih your configuration:
$this->load->library("Uploadhandler_generic", array(
'accept_file_types' => '/\.(gif|jpe?g|png)$/i', 'max_file_size' => 2048, 'upload_dir' => FCPATH . 'userfiles/product/', 'upload_url' => base_url() . 'userfiles/product/'
));
You need to actually process the upload:
if (!$this->upload->do_upload('userfile'))
{
// do something if the upload processing fails. You can output the errors using $this->upload->display_errors()
}
else
{
// do something if the upload is successful
// upload data will be stored in $this->upload->data()
}
By doing this, Codeigniter will take the file from your server's tmp directory and do with it what you want (such as moving it to its destination). Change userfile for the name of the file field.
Please note that if you need to process multiple files at once you'll need to loop through all files (which means a little tweaking on the above code)
I have an opensliding side panel in wich I display content. I have a working example, but it works on an ajax var that I've put in. I would like to scan a folder for the files loaded in my ajax code. How can I pass folder content into my ajax?
PHP
<div class="standorte-wrapper">
<div class="panel left"><!-- start pannel left -->
<div class="pan-item tl">
<button class="show-hide" data-ajaxFile="0">OPEN</button>
</div>
<div class="pan-item tr">
<button class="show-hide" data-ajaxFile="1">OPEN</button>
</div>
<div class="pan-item bl">
<button class="show-hide" data-ajaxFile="2">OPEN</button>
</div>
<div class="pan-item br">
<button class="show-hide" data-ajaxFile="3">OPEN</button>
</div>
</div><!-- end pannel left -->
<div id="open" class="panel right"><!-- start sliding pannel right -->
<div class="close-button">
close
</div>
<div id="content">
<div id="php-content"></div>
</div>
</div>
</div>
AJAX
$(document).ready(function() {
var ajaxUrls = [
'/standorteContent/brauerstrasse.php',
'/standorteContent/gutterstrasse.php',
'/standorteContent/kauffmannweg.php',
'/standorteContent/konradstrasse.php'
];
var ajaxFiles = [];
for (var i = 0; i < ajaxUrls.length; i++) {
$.ajax({
method: 'GET',
url: ajaxUrls[i],
success: function(data) {
//console.log(data);
ajaxFiles.push(data);
}
});
}
$('.adres-wrap > button').on('click', function() {
if ($('.panel.left').hasClass('open')) {
//alert('already open');
} else {
$('.panel.left').addClass('open', 1000, "easeInBack");
$('.standorte-wrapper').addClass('expand');
}
$('#php-content').html(ajaxFiles[$(this).attr('data-ajaxFile')]);
setTimeout(function (){
$('.panel.right div').fadeIn(400);
}, 500);
});
$('#close').on('click', function() {
$('.panel.right div').fadeOut(400);
setTimeout(function (){
$('.panel.left').removeClass('open');
$('.standorte-wrapper').removeClass('expand');
}, 500);
});
});
LOOKS LIKE
QUESTION
How can I change so that I don't have to add data-ajaxFile="nr" manual for every button? And I would like ajaxUrls get the path for php files only in a directory on my server. Can anyone help me out on this one?
I am working on a project where we are using a single instance of plupload to handle the uploads from multiple dropzones that are dynamically generated. We use Smarty templates, jQuery and PHP. There are a couple attributes that need to be carried over throughout the process as once the upload to the server hosting the application is successful, a transfer of the documents happens, transferring the document to AWS. I am struggling to understand how I can collect the need attributes during the initial upload through plupload. Currently, the files upload fine to the local server.
What I need is to get the id of the row, and the data-type attribute of the dropped-on row. You can see in the opening li the attributes id={$doc.id} and data-type={$doc.id}; these are the attributes I need to collect. Here is the markup for the form:
{foreach $document_set as $doc}
<li id="file-{$doc.id}" class="doc_list_row" data-type="{$doc.id}">
<div class="row doc_list_row">
<div class="col-sm-12" style="color: #fff">
<div class="row">
<div class="col-sm-12 doc_list_title">
<h4>{$doc.name}</h4>
</div>
</div>
<div class="row">
<div class="col-sm-8">
<div class="row">
<div class="col-sm-8 padtop-10">
<p>{$doc.description}</p>
</div>
</div>
<div class="row file_details_row">
<div class="col-sm-6">
<h4>Created On:</h4>
<p>{$doc.created}</h4>
</div>
<div class="col-sm-6">
<h4>Created By:</h4>
<p>{$doc.created_by}</p>
</div>
</div>
<div class="row file_details_row">
<div class="col-sm-6">
<h4>Updated On:</h4>
<p>{$doc.last_update}</h4>
</div>
<div class="col-sm-6">
<h4>Updated By:</h4>
<p>{$doc.last_update_by}</p>
</div>
</div>
</div>
<div class="col-sm-4 mng_file_icon_container">
<div class="row">
<div id="dl-{$doc.id}" class="col-xs-6 col-sm-6 dl_icon" data-filename="fileURLWillGoHere">
<div id="dl_circle-{$doc.id}" class="dl_circle circle">
<div class="triangle-down">
</div>
<h3 class="dl_version">V.{$doc.version_depth}</h3>
</div>
</div>
<div class="col-xs-6 col-sm-6 upld_icon" data-toggle="modal" data-target="#upld_file_modal">
<div id="upld_circle-{$doc.id}" class="upld_circle circle">
<div class="triangle-up">
</div>
<h3 class="upld_version">V.{$doc.version_depth + 1}</h3>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
{/foreach}
Here is the jQuery to handle this handoff:
var dom = { uploader: $("#dropbox"),
uploads: $("ul.doc_list_container"),
dropzones: $("li.doc_list_row")
};
uploader = new plupload.Uploader({
runtimes : "html5,silverlight,html4",
browse_button : "file-pick",
container : "file-cntr",
max_file_zie : '10mb',
url : "../upload.php",
drop_element: "dropbox",
filters : {title : "Text Files", extensions : "pdf, doc, docx, xls, xlsx, ppt, pptx"},
init: {
FilesAdded: function(up, files){ up.start(); $("#file-upld-progress").fadeIn(300); },
UploadProgress: function(up, file){ $("#file-upld-progress").text(file.percent + "%"); },
UploadComplete: function(up, file) { $("#file-upld-progress").fadeOut(300, function(){ setTimeout(function(){ $("#file-upld-progress").text(''); }, 2500); }); },
FileUploaded: function(up, file, resp, src) { uploadHandler(resp.response, src); },
Error: function(up, err) { showFormMsg("alert-error", "File Upload Error #" + err.code + ": " + err.message); }
},
multipart: true,
multipart_params : {}
});
uploader.bind("BeforeUpload", handlePluploadBeforeUpload);
uploader.bind("PostInit", handlePluploadInit);
uploader.bind("FilesAdded", handlePluploadFilesAdded);
uploader.init();
uploader.bind("FileUploaded", function(up, file, resp) { uploadHandler(resp.response); });
var fileType = '';
dom.dropzones.each(function(){
var dropzone = new mOxie.FileDrop({
drop_zone: $(this).attr('id')
});
dropzone.ondrop = function(e){
uploader.addFile(this.files);
// fileType = $(this);
};
dropzone.init();
var input = new mOxie.FileInput({
browse_button: $("#file-pick")[0],
container: this,
multiple: true
});
input.onchange = function(e){
uploader.addFile(input.files);
};
input.init()
});
function handlePluploadBeforeUpload( uploader, file ) {
params = uploader.settings.multipart_params;
var source = file.getSource();
// console.log(source);
// console.log(params.docType);
}
function handlePluploadInit(uploader, params){
// console.log("Initialization complete.");
// console.log("Drop-drop supported:", !! uploader.features.dragdrop);
}
function handlePluploadFilesAdded( uploader, files ) {
for ( var i = 0 ; i < files.length ; i++ ) {
files[i].docType = $(this).data('type');
}
}
And upload.php:
<?php
session_start();
require_once(dirname(dirname(__DIR__)).'/sites/site_settings.php');
//Output passed values from plUpload
/*$fh = fopen("./request.txt",'w');
fwrite($fh, "Request Dump\n");
fwrite($fh, print_r($_REQUEST, true));
fwrite($fh, "\n\nPost Dump\n");
fwrite($fh, print_r($_POST, true));
fwrite($fh, "\n\nGET Dump\n");
fwrite($fh, print_r($_GET, true));
fwrite($fh, "\n\nServer Dump\n");
fwrite($fh, print_r($_SERVER, true));
fwrite($fh, "\n\nFiles Dump\n");
fwrite($fh, print_r($_FILES, true));
fclose($fh);*/
if($_SERVER['REQUEST_METHOD'] == "POST")
{
if(! empty($_FILES['file']))
{
if($_FILES['file']['error'] === UPLOAD_ERR_OK)
{
$path_info = pathinfo($_FILES['file']['name']);
$file_extension = strtolower($path_info["extension"]);
$extension_whitelist = array("pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx");
$doc_fk = $_FILES['file']['doc_fk'];
if(in_array($file_extension, $extension_whitelist))
{
try
{
$url = ADMIN_URL."/documents/temp/";
$path = ADMIN_PATH."/documents/temp/";
$fname = cleanFilename($_FILES['file']['name']);
if(move_uploaded_file($_FILES["file"]["tmp_name"], $path.$fname))
$ret = array("error" => 0, "path" => $url, "givenName" => $_FILES['file']['name'], "storedName" => $fname, "ext" => $file_extension, "doc_fk" => $doc_fk);
else
$ret = array("error" => 1, "error_msg" => "Failed to Upload File to System");
}
catch(Exception $e)
{
$ret = array("error" => 1, "error_msg" => $e->getMessage());
}
}
else
$ret = array("error" => 1, "error_msg" => "Invalid file type: $file_extension. File must be PDF, Word Document, Excel Spreadsheet or a PowerPoint Presentation.");
}
else
$ret = array("error" => 1, "error_msg" => "Upload Error Occurred");
}
}
else
$ret = array("error" => 1, "error_msg" => "Failed POST check: ".$_SERVER[REQUEST_METHOD]);
echo json_encode($ret);
?>
Once I understand how to collect those two attributes, I will be able to move forward with completing this part of the project. This is the last hangup, and has absorbed several hours of trial and error, following a variety of GitHub articles, and SO threads. I've also referred to plupload's forums and haven't encountered anything quite similar to what we are doing here. TIA for any assistance!
Here's the solution we managed to come up with for our use case in this scenario. With our jQuery, we create an array of uploaders. This is where our dynamically generated uploader's id's will be stored. Then for each potential uploader, we instantiate a new uploader. Considering we iterate on the doc_list_row class, we are able to acquire the individual id of each list row, and place this in drop_element.
Everything else from here south is essentially the same as a typical plupload instance.I included our uploadHandler function simply for reference, it is not necessary if you handle the upload success differently. Keep in mind we use smarty templates and xajax, so if you use standard ajax, or another language other than PHP for you backend, some of this code will not directly work for you! I hope this helps others in a similar situation figure out the next step as this use case was a bit difficult to conquer.
jQuery
/*******************************************************************************
*
* Upload Document
*
*
*******************************************************************************/
function initUploaders(){
if($("li.doc_list_row").length){
upldrs = new Array();
$("li.doc_list_row").each(function(){
upld = new plupload.Uploader({
runtimes : "html5",
url : "upload.php",
dragdrop: true,
drop_element : $(this).attr("id"),
browse_button : $(this).find("div.upld_icon").attr("id"),
filters: {
max_file_size : '10mb',
mime_types: [{title : "Scan Files", extensions : "pdf,jpg,jpeg,png,xls,xlsx,doc,docx"}]
},
multipart_params : {DOC_ID: $(this).attr("data-doc")},
init: {
// FilesAdded: function(up, files){ up.start(); },
FilesAdded: function(up, files){ up.start(); showProgressBar(up); },
UploadProgress: function(up, file){ $(".upld-progress").css("width", file.percent + "%"); },
UploadComplete: function(up, file) { hideProgressBar(); },
FileUploaded: function(up, file, resp) { uploadHandler(resp.response); },
Error: function(up, err) { showFormMsg("alert-error", "File Upload Error #" + err.code + ": " + err.message); }
}
});
upld.init();
upldrs.push(upld);
});
}
}
/*******************************************************************************
*
* Response handler for plupload
*
*
*******************************************************************************/
function uploadHandler(resp){
var r = $.parseJSON(resp);
if(r.error)
showFormMsg("alert-danger", "Upload Error: " + r.error_msg);
else{
var elemId = $(upld.settings.drop_element[0]).attr('id').split('-');
showFormMsg('alert-success', 'Upload successful.');
xajax_paginate(currentPage(), currentDept(), $("#filter-doc-category").val(), $("#search_doc_name-id").val().trim(), $("#search_publisher_name-id").val().trim());
$("#file-"+elemId).find('.unavail_dl_icon').removeClass('unavail_dl_icon').addClass('dl_icon');
}
}
HTML
{if $documents_set|default:0}
{foreach $documents_set as $doc}
<li id="file-{$doc.id}" class="doc_list_row" data-doc="{$doc.id}" data-ondeck="0" data-default="{$doc.name}">
<div class="row doc_list_row">
<div class="col-sm-8">
<div class="row">
<div class="col-sm-12 doc_list_title">
<div class="col-sm-3"><h4>{$doc.name}</h4></div>
<div class="col-sm-4" style="padding-top: 15px; margin-bottom: 0;">
<div id="doc-upld-bar-{$doc.id}" class="progress upld-progress">
<div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:100%"></div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-8">
<div class="row">
<div class="col-sm-8 padtop-10">
<p>{$doc.description}</p>
</div>
</div>
<div class="row file_details_row">
<div class="col-sm-6">
<h4>Last Update:</h4>
<p>{$doc.lastUpdate}</p>
</div>
<div class="col-sm-6">
<h4>Last Update By:</h4>
<p>{$doc.last_update_by}</p>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="row">
<div class="col-sm-12 mng_file_icon_container">
<div id="dl-{$doc.id}" class="col-xs-6 col-sm-6 {if $doc.file_list|default:''}dl_icon{else}unavail_dl_icon{/if}" data-doc="{$doc.id}">
<!-- This is the selector -->
{if $doc.file_list|default:''}
<select id="version-selector-{$doc.id}" class="available_versions">
{foreach $doc.file_list as $f}<option value="{$f}">{if $f#first}Current{else}{$f#index} Previous{/if}</option>{/foreach}
</select>
<div id="dl_circle-{$doc.id}" class="dl_circle circle" data-for="{$doc.file}">
<div class="triangle-down">
</div>
</div>
{else}
<select class="no_file" DISABLED>
<option>No File</option>
</select>
<div id="unavail_dl" class="unavail_dl_circle circle">
<div class="unavail_triangle">
</div>
</div>
{/if}
</div>
<div id="upld-{$doc.id}" class="col-xs-6 col-sm-6 upld_icon">
<div id="upld_circle-{$doc.id}" class="upld_circle circle">
<div class="triangle-up">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</li>
{/foreach}
I am using the jquery uploader from here.
This is my button:
<!-- 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>إضافة صورة</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" accept="image/png" name="files[]">
</span>
<br>
<small>الحد الأقصى لحجم الملف هو 2.5 ميجابايت</small><br>
</td>
<td align="left" valign="middle">
<!-- The global progress bar -->
<div id="progress" class="progress" style="width: 300px">
<div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
and this is my jquery:
/*jslint unparam: true */
/*global window, $ */
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = window.location.hostname === 'blueimp.github.io' ?
'//jquery-file-upload.appspot.com/' : 'jqueryupload/server/php/articlemedia/';
$('#fileupload').fileupload({
url: url,
dataType: 'json',
maxFileSize: 2500000,
done: function (e, data) {
$.each(data.result.files, function (index, file) {
// $('<p/>').text(file.name).appendTo('#files');
console.log("file", file.url) // see what this shows.
$("#imgLogo").attr("src", file.url);
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
window.location = '<?php echo $_SESSION["volow_domain_name"]; ?>memberarticlemedia?id=' + GetQueryStringValue('id');
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
I want to know how can I add a then pass it to the UploadHandler.php so that I can process it there (add it to a database record)?
Thanks,
Jassim
I don't know what I am doing wrong, but the PHP does run (I can notice it with the POST data on Firebug), but isn't echoed.
Here's my JS file :
$('.table_item').click(function() {
var ticket_nbr = $(this).children('td').attr("class");
var dataString = 'ticket_nbr='+ ticket_nbr;
$.ajax({
url: 'display.php',
type: 'POST',
data: dataString,
success: function(data) {
console.log(data);
$("#DisplayTicket").modal('setting', 'transition', 'vertical flip').modal('show');
},
error: function(e) {
console.log(e)
}
});
});
and the called PHP file :
if($_POST)
{
$ticket_nbr=$_POST['ticket_nbr'];
?>
<div id="DisplayTicket" class="ui large modal transition active visible" style="margin-top: -110px;">
<i class="close icon"></i>
<div class="header">
<?php echo $ticket_nbr; ?>
</div>
</div>
<?php
}
And here's the output I get on Firebug :
<div id="DisplayTicket" class="ui large modal transition hidden" style="margin-top: -110px;">
<i class="close icon"></i>
<div class="header">
ticket_3 // The post data sent
</div>
<div class="content">
<p>Merci, <span class="test_display"></span>.
</div>
</div>
Any help or hint would be great !
Thanks.
You're returning HTML but never adding it to body
success: function(data) {
console.log(data);
$(data).appendTo('body'); // <----------------------
$("#DisplayTicket").modal('setting', 'transition', 'vertical flip').modal('show');
},
Also, ideally dataString = 'ticket_nbr='+ ticket_nbr should be dataString = {'ticket_nbr': ticket_nbr}
You have to show/append the below div in the body or div.
<div id="DisplayTicket" class="ui large modal transition active visible" style="margin-top: -110px;">
<i class="close icon"></i>
<div class="header">
<?php echo $ticket_nbr; ?>
</div>
</div>
then use the below code on success.
$('#DisplayTicket').addClass('active');
$('#DisplayTicket').css('visibility','visible');