RE: [Trac] Upload a file to process it ! and than save it with some modifications !

23 views
Skip to first unread message

Cooke, Mark

unread,
Sep 19, 2012, 5:18:54 AM9/19/12
to trac-...@googlegroups.com
Note: please post in plain text if possible!

> -----Original Message-----
> From: trac-...@googlegroups.com On Behalf Of cyberbrain
> Sent: 19 September 2012 09:15
> To: trac-...@googlegroups.com
> Subject: [Trac] Upload a file to process it ! and than save
> it with some modifications !
>
> I'm trying to write a plugin for trac
> <http://trac.edgewall.org/> but I'm missing sthg.

`sthg`? What does that mean?

> I'm trying to upload a file to the sever using the POST
> method this a simplified example :
>
> <form id="MyForm" name="input" action="" method="post">
> <label for="attachment">URL :</label>
> <input type="file" name="GanttFile" value=""/>
> </form>
>
> Now I'm trying to process the uploaded file ,read it and do
> some modifications than save it or ask the user to choose
> where he wants to save the file (export some data from the
> trac database)...I'm still blocked at this level :
>
> def process_request(self, req):
> data = {}
> if req.method=='POST':
> file=req.args.get('GanttFile', 'value')
> # and now I'm blocked !! how can I modify this file
> # and then redirect or save it !

You cannot just get the file contents that easily. Here is the skeleton of what I came up with after searching the web for examples:

# ----------------------------------------------------------------------- #
def _do_upload(self, req):
"""_do_upload(self, req)

Try to read and process data from the uploaded request.
Will redirect either to the details page...
...or the main list with an error message.
"""
gantt_file = req.args.get('GanttFile')

if not hasattr(gantt_file, 'filename') or not gantt_file.filename:
add_warning(req, "No License Request file specified.")
req.redirect(req.href.mainpage())

if hasattr(gantt_file.file, 'fileno'):
size = os.fstat(gantt_file.file.fileno())[6]
else:
gantt_file.file.seek(0, 2) # seek to end of file
size = gantt_file.file.tell()
gantt_file.file.seek(0)
if size == 0:
add_warning(req, "Request is empty?")
req.redirect(req.href.mainpage())

gantt_data = gantt_file.file.read()
<processing goes here>

Note: I run this on windows.

> and if I try to display the content of the variable file I
> just get the name of the file not all the path ? By doing
> something like this :
>
> <input type="text" name="file" value ="$myfile" />
>
> and in my source code :
>
> def process_request(self, req):
> data = {}
> if req.method=='POST':
> myfile=req.args.get('GanttFile', 'value')
> # display the content
> data.update({
> 'myfile': myfile
> })
>
> This will display only the file name ...I need the absolute
> path to do some process !
>
> I'm I missing sthg. ? is that the right way ?
>
> Thanks !

I hope that helps...

~ mark c

cyberbrain

unread,
Sep 19, 2012, 5:38:09 AM9/19/12
to trac-...@googlegroups.com, mark....@siemens.com
Thanks for your answer it helped a lot ...!
I've tried your suggestion but it seems that i have a problem with this comand

            gantt_file = req.args.get('GanttFile')
It has no attribute called filename ??? so the code get stopped at this level :


            if not hasattr(gantt_file, 'filename') or not gantt_file.filename:

any idea ?
Thanks !

Cooke, Mark

unread,
Sep 19, 2012, 5:53:53 AM9/19/12
to trac-...@googlegroups.com
Note: please post in plain text if possible! and do not delete the whole context in replies as it makes it harder to get the whole picture...
gantt_file = req.args.get('GanttFile')

if not hasattr(gantt_file, 'filename') or not gantt_file.filename:
> -----Original Message-----
> From: cyberbrain [mailto:afat...@gmail.com]
> Sent: 19 September 2012 10:38
> To: trac-...@googlegroups.com
> Cc: Cooke, Mark
> Subject: Re: [Trac] Upload a file to process it ! and than
> save it with some modifications !
>
What does your html template look like? This is the relevant bits of mine:-

<!--! NB: do not use `action="upload"` here as this forms a URL.. -->
<form class="addnew" id="addcomponent"
method="post" enctype="multipart/form-data">
<fieldset>
<legend>New Request:</legend>
<div class="field">
<label>Request File: <br />
<input type="file" name="GanttFile" size="70" />
</label>
</div>
<div class="buttons">
<input type="submit" name="upload" value="${_('Upload')}"/>
</div>
</fieldset>
</form>

Note the `enctype` for the form...

~ mark c

cyberbrain

unread,
Sep 19, 2012, 8:16:47 AM9/19/12
to trac-...@googlegroups.com
PS : I' m answering directly over the Google interface ....how can I make it plain text ?

Thanks dude for your help ...the significant help was the : enctype="multipart/form-data"
I didn't put that in my template and the whole code get crazy cause of that :)

So I'm putting my code here for those who wants to reuse it or for better suggestions :

The Python class :


class ProjectPlugin(Component):
    implements(INavigationContributor, IRequestHandler, ITemplateProvider)

    # INavigationContributor methods
    def get_active_navigation_item(self, req):
        return 'helloworldv2linkIdentifier'

    def get_navigation_items(self, req):
        yield ('mainnav', 'helloworldv2linkIdentifier',
               tag.a('Gantt Export', href=req.href.myapppp()))


    # IRequestHandler methods
    def match_request(self, req):
        return re.match(r'/myapppp(?:_trac)?(?:/.*)?$', req.path_info)

    def process_request(self, req):
    # add the implements and chek the imports ! and the indents

        data = {}
        if req.method=='POST':
            if 'DispFile' in req.args:
                myFile=req.args.get('Fily','value')
                data.update({
                    'myFile': myFile
                })
                dummy=req.args.get('Fily','value').filename
                data.update({
                        'dummy': dummy
                    })
                # file  reading
                mystream = myFile.file.read()


        # This tuple is for Genshi (template_name, data, content_type)
        # Without data the trac layout will not appear.
        return 'GanttTemplate.html', data, None

    # ITemplateProvider methods
    # Used to add the plugin's templates and htdocs
    def get_templates_dirs(self):
        from pkg_resources import resource_filename
        return [resource_filename(__name__, 'templates')]

    def get_htdocs_dirs(self):
        return []

The GanttTemplate.html file :


<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="layout.html" />
 
  <head>
    <title>Gant Export Tool</title>
  </head>

  <body> 
   
 
    <form id="GanttForm1" name="inputForm2" action="" method="POST" enctype="multipart/form-data">       
        <fieldset id="operations" >
            <legend >
                Configuration
            </legend>
           
            <label for="Fily">URL :</label>           
            <input type="file" name="Fily" value=""/><br /><br />
            Dummy variable = $dummy            <br/>
            <input type="submit" name="DispFile" value="Display the file"/><br /><br />
        </fieldset>
    </form>
    <br /><br /><br /><br /><br />
  </body>
</html>



Just one more question :
How can I redirect the modified stream to a window which ables the user to choose a file name and emplacement ?

Thanks a lot !




On Wednesday, September 19, 2012 10:14:50 AM UTC+2, cyberbrain wrote:
 


I'm trying to write a plugin for trac but I'm missing sthg.

I'm trying to upload a file to the sever using the POST method this a simplified example :

<form id="MyForm" name="input" action="" method="post">
    <label for="attachment">URL :</label>           
    <input type="file" name="GanttFile" value=""/>
</form>

 

Now I'm trying to process the uploaded file ,read it and do some modifications than save it or ask the user to choose where he wants to save the file (export some data from the trac database)...I'm still blocked at this level :

def process_request(self, req):
    data = {}
    if req.method=='POST':
        file=req.args.get('GanttFile', 'value')
        # and now I'm blocked !! how can I modify this file 
        # and then redirect or save it !   

Voelker, Bernhard

unread,
Sep 19, 2012, 8:53:17 AM9/19/12
to trac-...@googlegroups.com
cyberbrain wrote:
> ...the significant help was the : enctype="multipart/form-data"

that's essential and therefore the crucial point
for every file upload <form> ;-)

Have a nice day,
Berny

cyberbrain

unread,
Sep 19, 2012, 8:57:31 AM9/19/12
to trac-...@googlegroups.com
I still have a question : See last post right down !...
I will ask it again :

How can I redirect the modified stream to a window which ables the user to choose a file name and emplacement ?

Thanks for any one who helped me ! and those who didn't :P

Voelker, Bernhard

unread,
Sep 19, 2012, 9:27:34 AM9/19/12
to trac-...@googlegroups.com
cyberbrain wrote:

> How can I redirect the modified stream to a window which
> ables the user to choose a file name and emplacement ?

You mean that the user is uploading a file, then the server
modifies it, and sends it directly back to the user, so that
the browser should display the "save as" dialog?

Then your server-side program should send these HTTP response
headers, e.g.:

Content-Disposition: attachment;filename="somefile.zip"
Content-Type: application/octet-stream

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17


Have fun,
Berny

cyberbrain

unread,
Sep 19, 2012, 10:10:21 AM9/19/12
to trac-...@googlegroups.com
Thanks I will check that out !
Reply all
Reply to author
Forward
0 new messages