webish: make POST /uri?t=upload deposit you on an 'Upload Results' page

This commit is contained in:
Brian Warner 2008-02-05 23:01:37 -07:00
parent 604d6d54ef
commit 1e4504463c
4 changed files with 66 additions and 11 deletions

View File

@ -177,8 +177,9 @@ f. uploading a file
POST http://localhost:8123/uri?t=upload
This action also uploads a file without attaching it to a virtual drive
directory, but can be used from an HTML form. The response is the file
read cap.
directory, but can be used from an HTML form. The response is an HTML page
that describes the results of the upload, including the resulting URI (but
also including information about which peers were used, etc).
POST http://localhost:8123/uri?t=upload&mutable=true

View File

@ -993,6 +993,17 @@ class Web(WebMixin, unittest.TestCase):
def test_POST_upload_no_link(self):
d = self.POST("/uri", t="upload",
file=("new.txt", self.NEWFILE_CONTENTS))
def _check_upload_results(page):
# this should be a page which describes the results of the upload
# that just finished.
self.failUnless("Upload Results:" in page)
self.failUnless("URI:" in page)
uri_re = re.compile("URI: <tt><span>(.*)</span>")
mo = uri_re.search(page)
self.failUnless(mo, page)
new_uri = mo.group(1)
return new_uri
d.addCallback(_check_upload_results)
d.addCallback(self.failUnlessCHKURIHasContents, self.NEWFILE_CONTENTS)
return d

View File

@ -0,0 +1,22 @@
<html xmlns:n="http://nevow.com/ns/nevow/0.1">
<head>
<title>AllMyData - Tahoe - File Uploaded</title>
<!-- <link href="http://www.allmydata.com/common/css/styles.css"
rel="stylesheet" type="text/css"/> -->
<link href="/webform_css" rel="stylesheet" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Uploading File... <span n:render="string" n:data="done" /></h1>
<h2>Upload Results:</h2>
<ul>
<li>URI: <tt><span n:render="string" n:data="uri" /></tt></li>
<li>Download link: <span n:render="download_link" /></li>
</ul>
<div>Return to the <a href="/">Welcome Page</a></div>
</body>
</html>

View File

@ -7,7 +7,7 @@ from twisted.internet import defer, address
from twisted.internet.interfaces import IConsumer
from nevow import inevow, rend, loaders, appserver, url, tags as T
from nevow.static import File as nevow_File # TODO: merge with static.File?
from allmydata.util import fileutil, idlib
from allmydata.util import fileutil, idlib, observer
import simplejson
from allmydata.interfaces import IDownloadTarget, IDirectoryNode, IFileNode, \
IMutableFileNode
@ -1242,16 +1242,37 @@ class UnlinkedPUTCreateDirectory(rend.Page):
class UnlinkedPOSTCHKUploader(rend.Page):
def renderHTTP(self, ctx):
req = inevow.IRequest(ctx)
assert req.method == "POST"
"""'POST /uri', to create an unlinked file."""
docFactory = getxmlfile("unlinked-upload.xhtml")
# "POST /uri", to create an unlinked file.
def __init__(self, client, req):
rend.Page.__init__(self)
# we start the upload now, and distribute notification of its
# completion to render_ methods with an ObserverList
assert req.method == "POST"
self._done = observer.OneShotObserverList()
fileobj = req.fields["file"].file
uploadable = FileHandle(fileobj)
d = IClient(ctx).upload(uploadable)
d.addCallback(lambda results: results.uri)
# that fires with the URI of the new file
d = client.upload(uploadable)
d.addBoth(self._done.fire)
def upload_results(self):
return self._done.when_fired()
def data_done(self, ctx, data):
d = self.upload_results()
d.addCallback(lambda res: "done!")
return d
def data_uri(self, ctx, data):
d = self.upload_results()
d.addCallback(lambda res: res.uri)
return d
def render_download_link(self, ctx, data):
d = self.upload_results()
d.addCallback(lambda res: T.a(href="/uri/" + urllib.quote(res.uri))
["/uri/" + res.uri])
return d
class UnlinkedPOSTSSKUploader(rend.Page):
@ -1340,7 +1361,7 @@ class Root(rend.Page):
if mutable:
return UnlinkedPOSTSSKUploader(), ()
else:
return UnlinkedPOSTCHKUploader(), ()
return UnlinkedPOSTCHKUploader(client, req), ()
if t == "mkdir":
return UnlinkedPOSTCreateDirectory(), ()
errmsg = "/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, and POST?t=mkdir"