I have tried this, and it throws a read error exception on even valid tar files.
-Thadeus On Tue, Nov 24, 2009 at 6:37 PM, mdipierro <[email protected]> wrote: > > basically we do that now for w2p files. > > On Nov 24, 6:03 pm, Richard <[email protected]> wrote: > > instead of using is_tarfile() you could use the TarFile class (which > > can take a file object) to check whether the data can be interpreted > > as a tar file: > > > > from tarfile import TarFile, TarError > > from StringIO import StringIO > > > > try: > > TarFile(fileobj=StringIO(data)) > > except TarError: > > print "Not a tar file" > > > > On Nov 24, 3:47 pm, Thadeus Burgess <[email protected]> wrote: > > > > > Ah yes would love to, however it ends up copy the file twice, since it > will > > > do it in my function, and then again later on in SQLFORM.accepts. > > > > > This is the modified version, it works, I just need to make sure the > file is > > > not too large for the server to handle. > > > > > The limitation really comes from tarfile.is_tarfile, it expects and > requires > > > a filename, because it wants to open the file itself. Therefore I need > a > > > copy of the file somewhere besides in memory. > > > > > Any ideas on improvements or a better way? > > > > > def is_valid_tar(form): > > > import tarfile, os, random, shutil > > > tmppath = os.path.join(request.folder, 'uploads', > 'tmpupf%f.temp.w2p' % > > > random.random()) > > > f = form.vars.file.file > > > try: > > > dest_file = open(tmppath, 'wb') > > > shutil.copyfileobj(f, dest_file) > > > except: > > > pass > > > finally: > > > dest_file.close() > > > > > if not tarfile.is_tarfile(tmppath): > > > form.errors.file = "Invalid file format" > > > > > try: > > > os.remove(tmppath) > > > except: > > > pass > > > > > #... > > > form.accepts(...onvalidation=is_valid_tar) > > > > > -Thadeus > > > > > On Mon, Nov 23, 2009 at 10:31 PM, Richard <[email protected]> wrote: > > > > > > IIRC, you can use db.table.field.store(request.vars.field) to get the > > > > web2py generated filename. > > > > > > On Nov 24, 2:53 pm, Thadeus Burgess <[email protected]> wrote: > > > > > The problem is I am trying to get the file from the function in > > > > > SQLFORM.onvalidation... and this happens before the file gets > renamed or > > > > > saved to the disk. The only way i see of accomplishing this is > > > > > > > if form.accepts(request.vars, session, dbio=False): > > > > > > > #def is_plugin_archive(form) > > > > > #import tarfile, os > > > > > #path = os.path.join(db._folder, '..', 'uploads', > > > > > form.vars.file_newfilename) > > > > > > > #if not tarfile.is_tarfile(path): > > > > > #form.errors.file = "Not a valid tar archive" > > > > > > > is_plugin_archive(form) > > > > > > > if not form.errors: > > > > > session.flash = "Version uploaded." > > > > > redirect(URL(r=request, f='plug', args= > plugin.id)) > > > > > else: > > > > > response.flash = "There were errors with the > file" > > > > > > > elif form.errors: > > > > > response.flash = "There were errors" > > > > > > > -Thadeus > > > > > > > On Mon, Nov 23, 2009 at 9:46 PM, mr.freeze <[email protected]> > wrote: > > > > > > ieve it is form.vars.<upload_field>_newfilename. You should be > > > > > > able to get the path > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---

