Ok, as usual my blindness/dumbness knows no boundaries, as I suspect.

Thankfully a new set of eyes usually helps me to in the right track, 
basically what I had to do what use my old JS code... change the cgi target 
to a controller function

and that function was:

def testdownform():
    
    filename = request.vars.save_as
    protlist = request.vars.protlist
    
    response.headers['Content-Type'] = 'text/csv'
    response.headers['Content-Disposition'] = \
                "attachment; filename=%s" % filename
                
    return protlist

Not using my head beyond just shoulder decoration, I forgot to remember 
that basically a form is POSTed and I could just retrieve the request.vars 
... I might have attempted that, but probably had some syntax error (like 
trying to print protlist *cough* instead of returning it) that led me 
astray from that path :s

Anyhow, *problem solved*! 

Thanks again Niphlod for helping me see the light :)
 

~KM

On Monday, October 14, 2013 10:50:55 PM UTC+1, Kariloy Markief wrote:
>
> Thanks,
>
> Yeah it figures it would be something dumb on my part like that. :s 
> I'm actually trying to port an old site I've made over a couple of years 
> back...
>
> So, basically on that js I processed everything I wanted out of the page 
> and then...
>
>
> (...)
>
> var hidden_list = document.createElement('input');
> hidden_list.type = 'hidden';
> hidden_list.id = 'protlist';
> hidden_list.name = 'protlist';
> hidden_list.value = tsv;
>
>
> var save_as = document.createElement('input');
> save_as.type = 'hidden';
> save_as.id = 'save_as';
> save_as.name = 'save_as';
> save_as.value = file_name;
>
>
> form.appendChild(hidden_list);
> form.appendChild(save_as);
>
>
> form.action = '/path/to/cgiscript/saver.py'
> form.submit();
> form.removeChild(hidden_list);
> form.removeChild(save_as);
>
> and then on the saver.py file
>
>
> import cgi
>
>
> form = cgi.FieldStorage()
>
>
> filename = form.getvalue("save_as")
>
>
> print "Content-type: text/tsv"
> print "Content-disposition: attachment; filename= %s" %filename 
> print
>
>
> protlist = form.getvalue("protlist")
>
>
> print protlist
>
>
> I even tried to get cheeky and cheat-y and plug that in, and/or convert it 
> (and it may just be what you suggested last, but failed miserably to adapt 
> it)
>
>
> Right now, with your first suggestion and as a quick test I've done:
>
>
> var tsv2 = "cenas";
> window.open(encodeURI('download_prots?filename='+file_name+'&text='+tsv2),
> '_target'); 
>
> only to be greeted with a
>
> *invalid request*
>
>
> So, probably it's best to try and adapt my old strategy... could I still 
> submit an "hand-crafted" form like that to a controller function? and how 
> would I "unpack" the variables? (cgi didn't seem to work here).
>
> Well I'll keep at it and hopefully find a way, but appreciate any help 
> getting there :)
>
>
>
>
>
> On Monday, October 14, 2013 8:18:15 PM UTC+1, Niphlod wrote:
>>
>> you can't get a "save as" dialog if the contents of the file are 
>> retrieved via ajax (browsers don't work like that). Open a new window 
>> pointing to the download url (it will soon close as there's no content to 
>> show, and the "save as" dialog will pop up).
>>
>> PS: you'd really want to use another system than the simple concatenation 
>> to build the url... if "content" in your case contains csv data, you will 
>> never be able to reach that url (because it won't be a valid url). 
>> As last resort, at least urlencode the content. But you'll then face the 
>> limitation of url size, and that's why usually those kind of things are 
>> made with intermediate temp files or (slightly more complicated in a new 
>> window) POST requests :P 
>>
>> On Monday, October 14, 2013 6:15:51 PM UTC+2, Kariloy Markief wrote:
>>>
>>> Hello,
>>>
>>> I'm writing an app that at some point has a text string dynamically 
>>> generated in a view via javascript.
>>> What I would like to do is download that text as a file.
>>> For that purpose my attempted approach has been...:
>>>
>>> - on the same js function that generates the string I call:
>>>
>>> ajax('download_test?content='+content, [], '');
>>>
>>>
>>> and on the controller I have:
>>>
>>>
>>> def download_test():
>>>         
>>>     content = request.vars.content
>>>         
>>>     response.headers['Content-Type'] = 'text/csv'
>>>     attachment = 'attachment;filename=data.csv'
>>>     response.headers['Content-Disposition'] = attachment
>>>     
>>>     raise HTTP(200,str(content),
>>>                    **{'Content-Type':'text/csv',
>>>                       'Content-Disposition':attachment + ';'})
>>>
>>>
>>> I've tried several variations around this approach, and the only thing 
>>> that I can confirm is that the desired content is effectively passed from 
>>> the the view to the controller (and back to the view if I define a 
>>> container as the 3rd parameter of the ajax() function, but that's not what 
>>> I want).
>>>
>>> So the problem here seems to be be triggering the download. 
>>>
>>> I've tried this on firefox (running my app), and also on chromium (via 
>>> minimal app just to reproduce this issue). 
>>>
>>> I'm running web2py version 2.4.7
>>>
>>> Also the most similar reported issue I've found in this list was:
>>> https://groups.google.com/forum/#!topic/web2py/GH2HVCGPMKo
>>>
>>> Because no answer was found then and I was unsure about this group's 
>>> policy of reviving old threads, I published mine as a new question. Hope 
>>> this is ok.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to