mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-04-10 12:20:02 +00:00
webish: make POST /uri?t=upload deposit you on an 'Upload Results' page
This commit is contained in:
parent
604d6d54ef
commit
1e4504463c
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
22
src/allmydata/web/unlinked-upload.xhtml
Normal file
22
src/allmydata/web/unlinked-upload.xhtml
Normal 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>
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user