You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Wes Wannemacher <we...@wantii.com> on 2009/06/04 14:38:02 UTC
Re: Ajax file upload + RE: About the "struts.multipart.saveDir" for
file upload
Really, I haven't gotten that far yet, I am only working to improve
the integration with Jakarta FileUpload. JFU is quite capable and
mature, but I figured the first step would be to expose more
functionality since there were a few JIRAs related to people asking
for more than what is currently offered.
I committed a partially complete plugin to the sandbox yesterday
before I left my office, but I still need to glue it together with
configuration, etc. (and work out a bug I realized I had in the middle
of the night last night). Once I get the plugin to an installable
state, you can check it out. I figure the first step is to make the
plugin work, then the next step is building an example UI. I am not
sure how I am going to build the example UI, but JQuery is probably
the most likely candidate for me.
As far as selecting multiple files with Ctrl-Click, I'm not sure if
that is possible... Not from a struts/jquery perspective, but I don't
know if the browser will let you do that. I think Flash may be the
only option (or a java applet or something, but flash is more likely),
so we can come back to that later.
-Wes
On Thu, Jun 4, 2009 at 4:07 AM, Qunhuan Mei <qm...@qm18.wanadoo.co.uk> wrote:
> Hi Wes,
>
> Struts’ ajax file upload would be very interesting to me since I have
> implemented jQuery (http://www.phpletter.com/Our-Projects/AjaxFileUpload/)
> and Struts for ajax file upload in my application and had one or two
> problem(s).
>
> FYI: My use case is to upload a file, together with utf8 encoded caption.
> The problem I had is utf8 encoded caption needs to be sent via HTTP POST, it
> won’t work with HTTP get. But the jQuery arrangement is sending file in POST
> while sending caption in Get. So what I did is to send caption and file in
> two POSTs which cause other complications. Later the author (Øyvind Saltvik
> oyvind.saltvik@gmail.com) sent me the following code contributed by
> (Prokofiev Nikolay nprokofiev@gmail.com) which added the parameter POSTing
> (e.g. caption) to jQuery’s file upload.
>
> $.ajaxFileUpload
> (
> {
> url:document.location+'&ajax=true',
> secureuri:false,
> fileElementId:'fileToUpload',
> data: {foo: 'ghffgh', bar: 'fghfhgg'},
> dataType: 'json',
> success: function (data, status)
> {
> if(typeof(data.error) != 'undefined')
> {
> if(data.error != '')
> {
> alert(data.error);
> }else
> {
> alert(data.msg);
> }
> }
> },
> error: function (data, status, e)
> {
> alert(e);
> }
> }
> )
>
> here is the script:
> jQuery.extend({
> createUploadIframe: function(id, uri)
> {
> //create frame
> var frameId = 'jUploadFrame' + id;
>
> if(window.ActiveXObject) {
> var io = document.createElement('<iframe id="' + frameId +
> '" name="' + frameId + '" />');
> if(typeof uri== 'boolean'){
> io.src = 'javascript:false';
> }
> else if(typeof uri== 'string'){
> io.src = uri;
> }
> }
> else {
> var io = document.createElement('iframe');
> io.id = frameId;
> io.name = frameId;
> }
> io.style.position = 'absolute';
> io.style.top = '-1000px';
> io.style.left = '-1000px';
>
> document.body.appendChild(io);
>
> return io
> },
> createUploadForm: function(id, fileElementId, postData)
> {
> //create form
> var formId = 'jUploadForm' + id;
> var fileId = 'jUploadFile' + id;
> var form = $('<form action="" method="POST" name="' + formId + '"
> id="' + formId + '" enctype="multipart/form-data"></form>');
> var oldElement = $('#' + fileElementId);
> var newElement = $(oldElement).clone();
> $(oldElement).attr('id', fileId);
> $(oldElement).before(newElement);
> $(oldElement).appendTo(form);
> try
> {
> for(param in postData)
> {
> var input = document.createElement('input');
> input.setAttribute('name', param);
> input.setAttribute('value', postData[param]);
> $(input).appendTo(form);
> }
> }
> catch(e) {}
> //set attributes
> $(form).css('position', 'absolute');
> $(form).css('top', '-1200px');
> $(form).css('left', '-1200px');
> $(form).appendTo('body');
> return form;
> },
> ajaxFileUpload: function(s) {
> // TODO introduce global settings, allowing the client to modify
> them for all requests, not only timeout
> s = jQuery.extend({}, jQuery.ajaxSettings, s);
> var id = new Date().getTime()
> var form = jQuery.createUploadForm(id, s.fileElementId, s.data);
> var io = jQuery.createUploadIframe(id, s.secureuri);
> var frameId = 'jUploadFrame' + id;
> var formId = 'jUploadForm' + id;
> // Watch for a new set of requests
> if ( s.global && ! jQuery.active++ )
> {
> jQuery.event.trigger( "ajaxStart" );
> }
> var requestDone = false;
> // Create the request object
> var xml = {}
> if ( s.global )
> jQuery.event.trigger("ajaxSend", [xml, s]);
> // Wait for a response to come back
> var uploadCallback = function(isTimeout)
> {
> var io = document.getElementById(frameId);
> try
> {
> if(io.contentWindow)
> {
> xml.responseText =
> io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null
> ;
> xml.responseXML =
> io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:
> io.contentWindow.document;
>
> }else if(io.contentDocument)
> {
> xml.responseText =
> io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:
> null;
> xml.responseXML =
> io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocum
> ent:io.contentDocument.document;
> }
> }catch(e)
> {
> jQuery.handleError(s, xml, null, e);
> }
> if ( xml || isTimeout == "timeout")
> {
> requestDone = true;
> var status;
> try {
> status = isTimeout != "timeout" ? "success" : "error";
> // Make sure that the request was successful or
> notmodified
> if ( status != "error" )
> {
> // process the data (runs the xml through httpData
> regardless of callback)
> var data = jQuery.uploadHttpData( xml, s.dataType );
>
> // If a local callback was specified, fire it and
> pass it the data
> if ( s.success )
> s.success( data, status );
>
> // Fire the global callback
> if( s.global )
> jQuery.event.trigger( "ajaxSuccess", [xml, s] );
> } else
> jQuery.handleError(s, xml, status);
> } catch(e)
> {
> status = "error";
> jQuery.handleError(s, xml, status, e);
> }
>
> // The request was completed
> if( s.global )
> jQuery.event.trigger( "ajaxComplete", [xml, s] );
>
> // Handle the global AJAX counter
> if ( s.global && ! --jQuery.active )
> jQuery.event.trigger( "ajaxStop" );
>
> // Process result
> if ( s.complete )
> s.complete(xml, status);
>
> jQuery(io).unbind()
>
> setTimeout(function()
> { try
> {
> $(io).remove();
> $(form).remove();
>
> } catch(e)
> {
> jQuery.handleError(s, xml, null,
> e);
> }
>
>
> }, 100)
>
> xml = null
>
> }
> }
> // Timeout checker
> if ( s.timeout > 0 )
> {
> setTimeout(function(){
> // Check to see if the request is still happening
> if( !requestDone ) uploadCallback( "timeout" );
> }, s.timeout);
> }
> try
> {
> // var io = $('#' + frameId);
> var form = $('#' + formId);
> $(form).attr('action', s.url);
> $(form).attr('method', 'POST');
> $(form).attr('target', frameId);
> if(form.encoding)
> {
> form.encoding = 'multipart/form-data';
> }
> else
> {
> form.enctype = 'multipart/form-data';
> }
> $(form).submit();
>
> } catch(e)
> {
> jQuery.handleError(s, xml, null, e);
> }
> if(window.attachEvent){
> document.getElementById(frameId).attachEvent('onload',
> uploadCallback);
> }
> else{
> document.getElementById(frameId).addEventListener('load',
> uploadCallback, false);
> }
> return {abort: function () {}};
>
> },
>
> uploadHttpData: function( r, type ) {
> var data = !type;
> data = type == "xml" || data ? r.responseXML : r.responseText;
> // If the type is "script", eval it in global context
> if ( type == "script" )
> jQuery.globalEval( data );
> // Get the JavaScript object, if JSON is used.
> if ( type == "json" )
> eval( "data = " + data );
> // evaluate scripts within html
> if ( type == "html" )
> jQuery("<div>").html(data).evalScripts();
> //alert($('param',
> data).each(function(){alert($(this).attr('value'));}));
> return data;
> }
> })
>
> But during my tesing, the code appears to run ok only in IE (IE 7). It
> failed on Firefox (3.0.10), Safari (3.2.1) and Chrome (1.0.154.65), with
> simply no request received from the server after “jQuery(form).submit();”
> and no exception thrown or captured either. I reported the problem back but
> so far no reply (I am not a Javascript expert).
>
> Hope your ajax file upload approach will also handle UTF8 encoded caption –
> I certainly would do some testing when your code is ready
> The other issue in my mind about file upload is if “multi-file upload in one
> submit” could be achieved. I saw it in Flash version where user selects
> multiple files using Window’s file selection while keeping control key down.
> I suppose this ability would bring Struts’ file upload to the next level.
>
> Kind regards,
>
> Qunhuan
>
> -----Original Message-----
> From: Wes Wannemacher [mailto:wesw@wantii.com]
> Sent: 03 June 2009 22:03
> To: Struts Users Mailing List
> Subject: Re: About the "struts.multipart.saveDir" for file upload
>
>
> I'll check it out, I just wanted to improve what we had because it's
> currently impossible to do things like an AJAX upload with accurate
> progress bar. After I get the plugin (1.0-SNAPSHOT, which is the maven
> way of saying beta) committed to the sandbox, I'll whip up a quick
> example of how to do an AJAX w/progress bar using struts.
>
> -Wes
>
> On Wed, Jun 3, 2009 at 5:00 PM, Andy <an...@hotmail.com> wrote:
>>
>> That's great Wes. I am using the file upload but only sparingly (and
> hacked) due to some existing glitches.
>>
>>
>>
>> I read how the Stripes framework does file upload:
> http://www.stripesframework.org/display/stripes/File+Uploads
>>
>>
>>
>> Thought you might find it interesting/useful..
>>
>>
>>
>> Andy
>>
>>
>>
>>> Date: Wed, 3 Jun 2009 16:48:56 -0400
>>> Subject: Re: About the "struts.multipart.saveDir" for file upload
>>> From: wesw@wantii.com
>>> To: user@struts.apache.org
>>>
>>> I don't know if I would suggest it, but you might be able to call -
>>>
>>> Dispatcher.getInstance().setMultipartSaveDir(String path)
>>>
>>> Now, I can't remember if there is one dispatcher per thread, so you
>>> might have to call it in an interceptor.
>>>
>>> However, I would strongly suggest against doing that.
>>>
>>> I am working on an enhanced file upload plugin right now and will
>>> probably commit it to the sandbox by tomorrow. The problem with the
>>> stock file upload capability is that the FileItemFactory and
>>> FileUpload objects are not available to be overridden, and hardly any
>>> configuration is made visible. So, I've got a new
>>> JakartaMultiPartRequest class I'll have out by tomorrow.
>>>
>>> -Wes
>>>
>>> On Wed, Jun 3, 2009 at 4:37 PM, Andy <an...@hotmail.com> wrote:
>>> >
>>> > It defaults but I think he's wondering how he can set the dir
> programatically.
>>> >
>>> >
>>> >
>>> >> Date: Wed, 3 Jun 2009 15:35:33 -0500
>>> >> Subject: Re: About the "struts.multipart.saveDir" for file upload
>>> >> From: burtonrhodes@gmail.com
>>> >> To: user@struts.apache.org
>>> >>
>>> >> I wasn't aware that it was required. If you don't specify doesn't it
>>> >> default to the 'work' directory?
>>> >>
>>> >> On 6/3/09, Qunhuan Mei <qm...@qm18.wanadoo.co.uk> wrote:
>>> >> >
>>> >> > Hi,
>>> >> >
>>> >> > When implementing file upload, it is required to specify an absolute
>>> >> > directory in struts.xml such as following:
>>> >> >
>>> >> > <constant name="struts.multipart.saveDir"
> value="C:/fileUploadTempDir"
>>> >> > />
>>> >> >
>>> >> > But this might be difficult to achieve, say when the project war is
> deployed
>>> >> > in a external shared server and we do not have much idea about the
> directory
>>> >> > structure of the target server machine.
>>> >> >
>>> >> > I was wondering if there is any recommended way to handle this
> issue.
>>> >> >
>>> >> > Ideally I would like to specify the directory in java code where I
> can
>>> >> > detect the current working directory and specify the saveDir
> accordingly. Is
>>> >> > this possible?
>>> >> >
>>> >> > Many thanks in advance,
>>> >> >
>>> >> > Qunhuan
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
> ---------------------------------------------------------------------
>>> >> > To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> >> > For additional commands, e-mail: user-help@struts.apache.org
>>> >> >
>>> >> >
>>> >>
>>> >> --
>>> >> Sent from my mobile device
>>> >>
>>> >> ---------------------------------------------------------------------
>>> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> >> For additional commands, e-mail: user-help@struts.apache.org
>>> >>
>>> >
>>> > _________________________________________________________________
>>> > Windows Live™: Keep your life in sync.
>>> >
> http://windowslive.com/explore?ocid=TXT_TAGLM_WL_BR_life_in_synch_062009
>>>
>>>
>>>
>>> --
>>> Wes Wannemacher
>>> Author - Struts 2 In Practice
>>> Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
>>> http://www.manning.com/wannemacher
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> For additional commands, e-mail: user-help@struts.apache.org
>>>
>>
>> _________________________________________________________________
>> Insert movie times and more without leaving Hotmail®.
>>
> http://windowslive.com/Tutorial/Hotmail/QuickAdd?ocid=TXT_TAGLM_WL_HM_Tutori
> al_QuickAdd_062009
>
>
>
> --
> Wes Wannemacher
> Author - Struts 2 In Practice
> Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
> http://www.manning.com/wannemacher
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
--
Wes Wannemacher
Author - Struts 2 In Practice
Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
http://www.manning.com/wannemacher
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
RE: Ajax file upload + RE: About the "struts.multipart.saveDir" for file upload
Posted by Qunhuan Mei <qm...@qm18.wanadoo.co.uk>.
Ok Wes, I'll wait for your code to be ready. You guys hard work make us
developers' work easier. Many thanks for that! Qunhuan
-----Original Message-----
From: Wes Wannemacher [mailto:wesw@wantii.com]
Sent: 04 June 2009 13:38
To: Struts Users Mailing List
Subject: Re: Ajax file upload + RE: About the "struts.multipart.saveDir" for
file upload
Really, I haven't gotten that far yet, I am only working to improve
the integration with Jakarta FileUpload. JFU is quite capable and
mature, but I figured the first step would be to expose more
functionality since there were a few JIRAs related to people asking
for more than what is currently offered.
I committed a partially complete plugin to the sandbox yesterday
before I left my office, but I still need to glue it together with
configuration, etc. (and work out a bug I realized I had in the middle
of the night last night). Once I get the plugin to an installable
state, you can check it out. I figure the first step is to make the
plugin work, then the next step is building an example UI. I am not
sure how I am going to build the example UI, but JQuery is probably
the most likely candidate for me.
As far as selecting multiple files with Ctrl-Click, I'm not sure if
that is possible... Not from a struts/jquery perspective, but I don't
know if the browser will let you do that. I think Flash may be the
only option (or a java applet or something, but flash is more likely),
so we can come back to that later.
-Wes
On Thu, Jun 4, 2009 at 4:07 AM, Qunhuan Mei <qm...@qm18.wanadoo.co.uk> wrote:
> Hi Wes,
>
> Struts’ ajax file upload would be very interesting to me since I have
> implemented jQuery (http://www.phpletter.com/Our-Projects/AjaxFileUpload/)
> and Struts for ajax file upload in my application and had one or two
> problem(s).
>
> FYI: My use case is to upload a file, together with utf8 encoded caption.
> The problem I had is utf8 encoded caption needs to be sent via HTTP POST,
it
> won’t work with HTTP get. But the jQuery arrangement is sending file in
POST
> while sending caption in Get. So what I did is to send caption and file in
> two POSTs which cause other complications. Later the author (Øyvind
Saltvik
> oyvind.saltvik@gmail.com) sent me the following code contributed by
> (Prokofiev Nikolay nprokofiev@gmail.com) which added the parameter POSTing
> (e.g. caption) to jQuery’s file upload.
>
> $.ajaxFileUpload
> (
> {
> url:document.location+'&ajax=true',
> secureuri:false,
> fileElementId:'fileToUpload',
> data: {foo: 'ghffgh', bar: 'fghfhgg'},
> dataType: 'json',
> success: function (data, status)
> {
> if(typeof(data.error) != 'undefined')
> {
> if(data.error != '')
> {
> alert(data.error);
> }else
> {
> alert(data.msg);
> }
> }
> },
> error: function (data, status, e)
> {
> alert(e);
> }
> }
> )
>
> here is the script:
> jQuery.extend({
> createUploadIframe: function(id, uri)
> {
> //create frame
> var frameId = 'jUploadFrame' + id;
>
> if(window.ActiveXObject) {
> var io = document.createElement('<iframe id="' + frameId +
> '" name="' + frameId + '" />');
> if(typeof uri== 'boolean'){
> io.src = 'javascript:false';
> }
> else if(typeof uri== 'string'){
> io.src = uri;
> }
> }
> else {
> var io = document.createElement('iframe');
> io.id = frameId;
> io.name = frameId;
> }
> io.style.position = 'absolute';
> io.style.top = '-1000px';
> io.style.left = '-1000px';
>
> document.body.appendChild(io);
>
> return io
> },
> createUploadForm: function(id, fileElementId, postData)
> {
> //create form
> var formId = 'jUploadForm' + id;
> var fileId = 'jUploadFile' + id;
> var form = $('<form action="" method="POST" name="' + formId + '"
> id="' + formId + '" enctype="multipart/form-data"></form>');
> var oldElement = $('#' + fileElementId);
> var newElement = $(oldElement).clone();
> $(oldElement).attr('id', fileId);
> $(oldElement).before(newElement);
> $(oldElement).appendTo(form);
> try
> {
> for(param in postData)
> {
> var input = document.createElement('input');
> input.setAttribute('name', param);
> input.setAttribute('value', postData[param]);
> $(input).appendTo(form);
> }
> }
> catch(e) {}
> //set attributes
> $(form).css('position', 'absolute');
> $(form).css('top', '-1200px');
> $(form).css('left', '-1200px');
> $(form).appendTo('body');
> return form;
> },
> ajaxFileUpload: function(s) {
> // TODO introduce global settings, allowing the client to modify
> them for all requests, not only timeout
> s = jQuery.extend({}, jQuery.ajaxSettings, s);
> var id = new Date().getTime()
> var form = jQuery.createUploadForm(id, s.fileElementId, s.data);
> var io = jQuery.createUploadIframe(id, s.secureuri);
> var frameId = 'jUploadFrame' + id;
> var formId = 'jUploadForm' + id;
> // Watch for a new set of requests
> if ( s.global && ! jQuery.active++ )
> {
> jQuery.event.trigger( "ajaxStart" );
> }
> var requestDone = false;
> // Create the request object
> var xml = {}
> if ( s.global )
> jQuery.event.trigger("ajaxSend", [xml, s]);
> // Wait for a response to come back
> var uploadCallback = function(isTimeout)
> {
> var io = document.getElementById(frameId);
> try
> {
> if(io.contentWindow)
> {
> xml.responseText =
>
io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null
> ;
> xml.responseXML =
>
io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:
> io.contentWindow.document;
>
> }else if(io.contentDocument)
> {
> xml.responseText =
>
io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:
> null;
> xml.responseXML =
>
io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocum
> ent:io.contentDocument.document;
> }
> }catch(e)
> {
> jQuery.handleError(s, xml, null, e);
> }
> if ( xml || isTimeout == "timeout")
> {
> requestDone = true;
> var status;
> try {
> status = isTimeout != "timeout" ? "success" : "error";
> // Make sure that the request was successful or
> notmodified
> if ( status != "error" )
> {
> // process the data (runs the xml through httpData
> regardless of callback)
> var data = jQuery.uploadHttpData( xml, s.dataType
);
>
> // If a local callback was specified, fire it and
> pass it the data
> if ( s.success )
> s.success( data, status );
>
> // Fire the global callback
> if( s.global )
> jQuery.event.trigger( "ajaxSuccess", [xml, s]
);
> } else
> jQuery.handleError(s, xml, status);
> } catch(e)
> {
> status = "error";
> jQuery.handleError(s, xml, status, e);
> }
>
> // The request was completed
> if( s.global )
> jQuery.event.trigger( "ajaxComplete", [xml, s] );
>
> // Handle the global AJAX counter
> if ( s.global && ! --jQuery.active )
> jQuery.event.trigger( "ajaxStop" );
>
> // Process result
> if ( s.complete )
> s.complete(xml, status);
>
> jQuery(io).unbind()
>
> setTimeout(function()
> { try
> {
> $(io).remove();
> $(form).remove();
>
> } catch(e)
> {
> jQuery.handleError(s, xml,
null,
> e);
> }
>
>
> }, 100)
>
> xml = null
>
> }
> }
> // Timeout checker
> if ( s.timeout > 0 )
> {
> setTimeout(function(){
> // Check to see if the request is still happening
> if( !requestDone ) uploadCallback( "timeout" );
> }, s.timeout);
> }
> try
> {
> // var io = $('#' + frameId);
> var form = $('#' + formId);
> $(form).attr('action', s.url);
> $(form).attr('method', 'POST');
> $(form).attr('target', frameId);
> if(form.encoding)
> {
> form.encoding = 'multipart/form-data';
> }
> else
> {
> form.enctype = 'multipart/form-data';
> }
> $(form).submit();
>
> } catch(e)
> {
> jQuery.handleError(s, xml, null, e);
> }
> if(window.attachEvent){
> document.getElementById(frameId).attachEvent('onload',
> uploadCallback);
> }
> else{
> document.getElementById(frameId).addEventListener('load',
> uploadCallback, false);
> }
> return {abort: function () {}};
>
> },
>
> uploadHttpData: function( r, type ) {
> var data = !type;
> data = type == "xml" || data ? r.responseXML : r.responseText;
> // If the type is "script", eval it in global context
> if ( type == "script" )
> jQuery.globalEval( data );
> // Get the JavaScript object, if JSON is used.
> if ( type == "json" )
> eval( "data = " + data );
> // evaluate scripts within html
> if ( type == "html" )
> jQuery("<div>").html(data).evalScripts();
> //alert($('param',
> data).each(function(){alert($(this).attr('value'));}));
> return data;
> }
> })
>
> But during my tesing, the code appears to run ok only in IE (IE 7). It
> failed on Firefox (3.0.10), Safari (3.2.1) and Chrome (1.0.154.65), with
> simply no request received from the server after “jQuery(form).submit();”
> and no exception thrown or captured either. I reported the problem back
but
> so far no reply (I am not a Javascript expert).
>
> Hope your ajax file upload approach will also handle UTF8 encoded caption
–
> I certainly would do some testing when your code is ready
> The other issue in my mind about file upload is if “multi-file upload in
one
> submit” could be achieved. I saw it in Flash version where user selects
> multiple files using Window’s file selection while keeping control key
down.
> I suppose this ability would bring Struts’ file upload to the next level.
>
> Kind regards,
>
> Qunhuan
>
> -----Original Message-----
> From: Wes Wannemacher [mailto:wesw@wantii.com]
> Sent: 03 June 2009 22:03
> To: Struts Users Mailing List
> Subject: Re: About the "struts.multipart.saveDir" for file upload
>
>
> I'll check it out, I just wanted to improve what we had because it's
> currently impossible to do things like an AJAX upload with accurate
> progress bar. After I get the plugin (1.0-SNAPSHOT, which is the maven
> way of saying beta) committed to the sandbox, I'll whip up a quick
> example of how to do an AJAX w/progress bar using struts.
>
> -Wes
>
> On Wed, Jun 3, 2009 at 5:00 PM, Andy <an...@hotmail.com> wrote:
>>
>> That's great Wes. I am using the file upload but only sparingly (and
> hacked) due to some existing glitches.
>>
>>
>>
>> I read how the Stripes framework does file upload:
> http://www.stripesframework.org/display/stripes/File+Uploads
>>
>>
>>
>> Thought you might find it interesting/useful..
>>
>>
>>
>> Andy
>>
>>
>>
>>> Date: Wed, 3 Jun 2009 16:48:56 -0400
>>> Subject: Re: About the "struts.multipart.saveDir" for file upload
>>> From: wesw@wantii.com
>>> To: user@struts.apache.org
>>>
>>> I don't know if I would suggest it, but you might be able to call -
>>>
>>> Dispatcher.getInstance().setMultipartSaveDir(String path)
>>>
>>> Now, I can't remember if there is one dispatcher per thread, so you
>>> might have to call it in an interceptor.
>>>
>>> However, I would strongly suggest against doing that.
>>>
>>> I am working on an enhanced file upload plugin right now and will
>>> probably commit it to the sandbox by tomorrow. The problem with the
>>> stock file upload capability is that the FileItemFactory and
>>> FileUpload objects are not available to be overridden, and hardly any
>>> configuration is made visible. So, I've got a new
>>> JakartaMultiPartRequest class I'll have out by tomorrow.
>>>
>>> -Wes
>>>
>>> On Wed, Jun 3, 2009 at 4:37 PM, Andy <an...@hotmail.com> wrote:
>>> >
>>> > It defaults but I think he's wondering how he can set the dir
> programatically.
>>> >
>>> >
>>> >
>>> >> Date: Wed, 3 Jun 2009 15:35:33 -0500
>>> >> Subject: Re: About the "struts.multipart.saveDir" for file upload
>>> >> From: burtonrhodes@gmail.com
>>> >> To: user@struts.apache.org
>>> >>
>>> >> I wasn't aware that it was required. If you don't specify doesn't it
>>> >> default to the 'work' directory?
>>> >>
>>> >> On 6/3/09, Qunhuan Mei <qm...@qm18.wanadoo.co.uk> wrote:
>>> >> >
>>> >> > Hi,
>>> >> >
>>> >> > When implementing file upload, it is required to specify an
absolute
>>> >> > directory in struts.xml such as following:
>>> >> >
>>> >> > <constant name="struts.multipart.saveDir"
> value="C:/fileUploadTempDir"
>>> >> > />
>>> >> >
>>> >> > But this might be difficult to achieve, say when the project war is
> deployed
>>> >> > in a external shared server and we do not have much idea about the
> directory
>>> >> > structure of the target server machine.
>>> >> >
>>> >> > I was wondering if there is any recommended way to handle this
> issue.
>>> >> >
>>> >> > Ideally I would like to specify the directory in java code where I
> can
>>> >> > detect the current working directory and specify the saveDir
> accordingly. Is
>>> >> > this possible?
>>> >> >
>>> >> > Many thanks in advance,
>>> >> >
>>> >> > Qunhuan
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> >
> ---------------------------------------------------------------------
>>> >> > To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> >> > For additional commands, e-mail: user-help@struts.apache.org
>>> >> >
>>> >> >
>>> >>
>>> >> --
>>> >> Sent from my mobile device
>>> >>
>>> >> ---------------------------------------------------------------------
>>> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> >> For additional commands, e-mail: user-help@struts.apache.org
>>> >>
>>> >
>>> > _________________________________________________________________
>>> > Windows Live™: Keep your life in sync.
>>> >
> http://windowslive.com/explore?ocid=TXT_TAGLM_WL_BR_life_in_synch_062009
>>>
>>>
>>>
>>> --
>>> Wes Wannemacher
>>> Author - Struts 2 In Practice
>>> Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
>>> http://www.manning.com/wannemacher
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> For additional commands, e-mail: user-help@struts.apache.org
>>>
>>
>> _________________________________________________________________
>> Insert movie times and more without leaving Hotmail®.
>>
>
http://windowslive.com/Tutorial/Hotmail/QuickAdd?ocid=TXT_TAGLM_WL_HM_Tutori
> al_QuickAdd_062009
>
>
>
> --
> Wes Wannemacher
> Author - Struts 2 In Practice
> Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
> http://www.manning.com/wannemacher
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
--
Wes Wannemacher
Author - Struts 2 In Practice
Includes coverage of Struts 2.1, Spring, JPA, JQuery, Sitemesh and more
http://www.manning.com/wannemacher
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org