This widget validates file names and sizes on the client side instead of server side. The file does not need to be uploaded to server to validate its properties. Since the file is streamed to server, you may need to work out how you handle the code on the server side. I have provided a simple php code at the end of this article for anyone to start with.
Anyway in order to make this widget to work, you may need the following three extensions.
1. MultipleFileField
The default file field from ExtJs only allows you to upload single file at a time. To enable uploading multiple file, you need to tweak the DOM settings.
Multiple file field (inspired from here)
Ext.define('Ext.ux.form.field.MultipleFileField', {
extend: 'Ext.form.field.File',
alias:['widget.multifilefield',
'widget.multiplefilefield',
'widget.multifile'],
/**
* Override to add a "multiple" attribute.
*/
onRender: function() {
this.callParent(arguments);
this.fileInputEl.set({
multiple: 'multiple'
});
}
});
2. FileDrop
The FileDrop plugin allows user to drop their files via their desktop. FileDrop plugin is created by Mitchell Simoens and you can download it from here.
Please note: you may need to change the class name from "Ext.plugin.extjs.FileDrop" to "Ext.ux.form.FileDrop"
3. IFrame
The purpose of using IFrame widget is to show the file without downloading it. Those files might be *.html, *.txt, *.xml or *.pdf. Some users may just want to view it instead of downloading it.
You can download the widget from here and change the class name to 'Ext.ux.IFrame'
File upload grid panel
Ext.define('Ext.ux.form.FileUploadPanel', {
extend: 'Ext.panel.Panel',
alias: ['widget.filepanel','fileuploadpanel'],
requires:[
'Ext.ux.form.field.MultipleFileField',
'Ext.ux.form.FileDrop',
'Ext.ux.IFrame'
],
layout:'card',
autoLoadStore: true,
maxFileSize:10485760, // 10Mb
listUrl: '/file/getFileList', // your MVC path to get file list
listParams:{},
uploadUrl: '/file/upload', // your MVC path upload files
uploadParams:{},
downloadUrl: '/file/download', // your MVC path to download the file
downloadParams:{},
deleteUrl: '/file/delete', // your MVC path to delete the file
deleteParams:{},
/**
* initialising the components
*/
initComponent: function(){
var me = this;
// Create the datastore if available
if(!Ext.isDefined(me.store)){
me.store = Ext.create('Ext.data.Store', {
autoLoad:me.autoLoadStore,
fields:[
'name',
'size',
'type',
{name:'lastModifiedDate', type:'date', dateFormat:'Y-m-d H:i:s'},
'iconCls',
{name:'new_window', type:'bool'}
],
proxy:{
type:'ajax',
url:me.listUrl,
extraParams: me.listParams || undefined,
reader:{
type:'json',
root:'data'
},
listeners:{exception:Ext.onException }
}
});
};
// the temporary store to handle file uploading
me.progressStore = Ext.create('Ext.data.Store', {
fields:[
'name',
'size',
'type',
{name:'lastModifiedDate', type:'date', dateFormat:'Y-m-d H:i:s'},
{name: 'progress', type:'int'}
],
});
// create a tool bar
if(me.bbar !== false){
me.bbar = [{
xtype:'tbtext',
text:'Drap and drop your files to the grid'
},'->',{
xtype:'multifile',
buttonOnly:true,
allowBlank:true,
submitValue:false,
buttonConfig:{
text:'Add attachments',
iconCls:'icon-add'
},
listeners:{
render:function(){
var el = this.getEl(),
field = this;
el.dom.onchange = function(e){
me.checkFileUpload(e.target.files);
};
}
}
}];
};
// default config
var config = {
defaults:{
xtype:'grid',
enableColumnHide:false,
enableColumnMove:false,
plugins:[{
ptype: 'filedrop',
readType:'DataURL'
}]
},
tools: [{
type: 'refresh',
handler: function(){
me.store.load();
}
}],
items:[{
store:me.store,
columns:[{
header:'Files',
flex:1,
dataIndex:'name',
renderer:function(value, metaData, record){
var exportMode=false;
if(Ext.isDefined(metaData)
&& Ext.isDefined(metaData.exportMode)){
exportMode=metaData.exportMode
};
if(exportMode){
return value;
}else{
var lastModifiedDate = record.get('lastModifiedDate');
var date = Ext.util.Format.date(lastModifiedDate, "d/m/Y g:i a");
return ''+
''+value+''+
'Size: '+record.get('size')+', Last Modified: '+ date +'';
};
}
},{
xtype: 'actioncolumn',
cls: 'x-icon-column-header x-action-disk-column-header', // define your css icon here
width: 24,
icon: '/public/images/ext/silk/arrow_down.png', // change your icon path here
iconCls: 'x-hidden',
tooltip: 'Download selected file',
menuDisabled: true,
sortable: false,
handler: function(gridView, rowIndex, colIndex, item, e, record) {
gridView.select(record);
var params = Ext.applyIf({fileName:record.get('name')},me.downloadParams),
queryStr = Ext.Object.toQueryString(params),
url = me.downloadUrl + '/?' + queryStr;
if(record.get('new_window') === true){
me.showDownloadWindow(url,record);
}else{
window.location=url;
};
}
},{
xtype: 'actioncolumn',
cls: 'x-icon-column-header x-action-delete-column-header', // define your css icon here
width: 24,
icon: '/public/images/ext/silk/delete.png',
iconCls: 'x-hidden',
tooltip: 'Delete selected file',
menuDisabled: true,
sortable: false,
handler: function(gridView, rowIndex, colIndex, item, e, record) {
gridView.select(record);
var params = Ext.applyIf({fileName:record.get('name')},me.deleteParams);
Ext.Ajax.request({
url: me.deleteUrl,
params: params,
success: function(response){
me.store.load();
}
});
}
}],
listeners:{
itemmouseenter: function(view, list, node, rowIndex, e){
var icons = Ext.DomQuery.select('.x-action-col-icon', node);
Ext.each(icons, function(icon){
Ext.get(icon).removeCls('x-hidden');
});
},
itemmouseleave: function(view, list, node, rowIndex, e){
var icons = Ext.DomQuery.select('.x-action-col-icon', node);
Ext.each(icons, function(icon){
Ext.get(icon).addCls('x-hidden');
});
},
loadstart : function(cmp, e, file) {
me.checkFileUpload([file]);
}
}
},{
store: me.progressStore,
viewConfig:{
markDirty:false
},
columns:[{
header:'Files',
dataIndex:'name',
flex:1
},{
header:'Progress',
dataIndex:'progress',
align:'center',
width:90,
renderer: function (value, meta, record) {
var color = (value < 100) ? 'red' : 'green';
return Ext.String.format('{1}%', color, value);
}
}],
listeners:{
loadstart : function(cmp, e, file) {
me.checkFileUpload([file]);
}
}
}]
};
// appy to this config
Ext.applyIf(me, config);
// apply to the initialConfig
Ext.applyIf(me.initialConfig, config);
// call the arguments
me.callParent(arguments);
// init the settings
me.on('render',me.onPanelRender,me);
// assign title prefix
me.titlePrefix = me.title || 'Attachments';
},
// init store events when render
onPanelRender:function(){
var me = this;
if(me.store){
// create grid value to the store for future use
me.store.grid = me.items[0];
// change title when load
me.store.on('load',function(){
var count = me.store.count();
if(count > 0){
me.setTitle(me.titlePrefix + ' (' + count + ')');
}else{
me.setTitle(me.titlePrefix);
};
});
};
if(me.progressStore){
// if new file is uploading, then show progress panel
me.progressStore.on('add',function(){
me.getLayout().setActiveItem(1);
});
me.progressStore.on('remove',function(){
var count = me.progressStore.count();
if(count == 0){
me.getLayout().setActiveItem(0);
};
});
};
},
// when user uses filefield
checkFileUpload:function(files){
var me = this,
invalidList = [];
Ext.each(files, function(file){
if(file.size > me.maxFileSize){
invalidList.push(file);
};
});
if(invalidList.length > 0){
var msg = '- ';
Ext.each(invalidList, function(file){
msg += '
- ' + file.name + ' '; }); msg += '
- ';
Ext.each(invalidList, function(file){
msg += '
- ' + file.name + ' '; }); msg += '
- ';
Ext.each(invalidList, function(file){
msg += '
- ' + file.name + ' '; }); msg += '
Server Side (PHP Code)
private function upload($dstPath){
$fileName = $_SERVER['HTTP_X_FILE_NAME'];
$fileSize = $_SERVER['HTTP_X_FILE_SIZE'];
$fileType = $_SERVER['HTTP_X_FILE_TYPE'];
// open input stream
$input = fopen('php://input', 'r');
// open output stream
$output = fopen($dstPath . $fileName, 'a');
// start to write data
while ($data = fread($input, 1024)){
fwrite($output,$data);
}
// close input stream
fclose($input);
// close output stream
fclose($output);
$result= array(
'success' => true,
'data' => array('src'=>$dstPath . $fileName, 'file'=>$fileName, 'size'=>$fileSize, 'type'=>$fileType),
'total' => '1',
'message' => 'File uploaded successfully'
);
return $result;
}
private function delete($filePath){
$result = true;
if(file_exists($filePath)){
$result = unlink($filePath);
}
$result= array(
'success'=> $result,
'message'=> 'Success',
'file'=>$filePath
);
return $result;
}

Fancy attempting a roulette sport that you’ve by no means played before however don’t know the rules? Want to become familiar with the various types of roulette bets that can be be} placed? Or maybe you fancy attempting 우리카지노 one of many many roulette systems that exist with out dropping money? We have one of the best assortment of free roulette games on the web that permit you to play with zero danger.
ReplyDelete