Skip to content

Instantly share code, notes, and snippets.

@pcostesi
Created May 21, 2012 03:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pcostesi/2760443 to your computer and use it in GitHub Desktop.
Save pcostesi/2760443 to your computer and use it in GitHub Desktop.
Share files locally with a mobile device. Requires python-qrcode.
#!/usr/bin/python
# filedrop.py
import qrcode
import sys
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import shutil
import os
######
import qrcode.image.base
BLACK = "\033[40m"
WHITE = "\033[107m"
DEFAULT = "\033[49m"
SPACER = " "
class CliImage(qrcode.image.base.BaseImage):
"""Cli image builder."""
def __init__(self, border, width, box_size):
super(CliImage, self).__init__(border, width, box_size)
size = (self.width + border * 2)
self.border = border
self.width = width
self.lines = [[WHITE] * (size + 1) for i in xrange(size)]
def drawrect(self, row, col):
self.lines[row + self.border][col + self.border] = BLACK
def save(self, stream, kind=None):
stream.write(self.to_string())
def to_string(self):
return ('\n'.join(SPACER.join(l) + DEFAULT for l in self.lines))
######
class FileHandler(BaseHTTPRequestHandler):
def do_GET(self):
"""Serve a GET request."""
fileno = self.path.split("/")[-1]
f = self.dispatch_request()
if f:
shutil.copyfileobj(f, self.wfile)
f.close()
def do_HEAD(self):
"""Serve a HEAD request."""
f = self.dispatch_request()
if f:
f.close()
def dispatch_request(self):
fileno = int(self.path.split("/")[-1])
if fileno < 0 or fileno > len(self.__class__.server.filenames):
print fileno
self.send_error(404, "File not found")
return None
f = open(self.__class__.server.filenames[fileno], 'rb')
self.send_response(200)
self.send_header("Content-type", "application/octet-stream")
fs = os.fstat(f.fileno())
self.send_header("Content-Length", str(fs.st_size))
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
self.end_headers()
return f
class FileServer(object):
def __init__(self, filenames, host=None, port=8080):
self.filenames = filenames
self.cur = None
self.port = port
self.addr = host or socket.gethostbyname(socket.gethostname())
Handler = type("BoundFileHandler", (FileHandler, object), {"server": self})
self.httpd = HTTPServer(("", self.port), Handler)
def file_addr(self, f):
return "http://%s:%d/%s" % (self.addr, self.port, f)
def __iter__(self):
return self
def next(self):
if self.cur is None:
self.cur = 0
else:
self.cur += 1
if self.cur >= len(self.filenames):
raise StopIteration()
return self.file_addr(self.cur)
def serve(self):
self.httpd.handle_request()
def main(*args):
addr = args[0]
names = args[1:]
server = FileServer(names, addr)
for name in server:
print name
print qrcode.make(name, image_factory=CliImage).to_string()
server.serve()
if __name__ == '__main__':
main(*sys.argv[1:])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment