Get presigned upload token via ajax request

This commit is contained in:
richard-dds 2019-08-16 16:06:17 -04:00
parent b7f8152cc1
commit 7d1dfa1d0e
6 changed files with 25 additions and 20 deletions

View File

@ -13,6 +13,7 @@ UNPROTECTED_ROUTES = [
"atst.helpdocs", "atst.helpdocs",
"static", "static",
"atst.about", "atst.about",
"atst.upload_token",
] ]

View File

@ -9,6 +9,7 @@ from flask import (
request, request,
make_response, make_response,
current_app as app, current_app as app,
jsonify,
) )
from jinja2.exceptions import TemplateNotFound from jinja2.exceptions import TemplateNotFound
@ -41,6 +42,14 @@ def root():
return render_template("login.html", redirect_url=redirect_url) return render_template("login.html", redirect_url=redirect_url)
@bp.route("/upload-token")
def upload_token():
(token, object_name) = app.csp.files.get_token()
render_args = {"token": token, "objectName": object_name}
return jsonify(render_args)
@bp.route("/help") @bp.route("/help")
@bp.route("/help/<path:doc>") @bp.route("/help/<path:doc>")
def helpdocs(doc=None): def helpdocs(doc=None):

View File

@ -17,9 +17,7 @@ from atst.utils.flash import formatted_flash as flash
def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None): def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None):
(token, object_name) = current_app.csp.files.get_token() render_args = {}
render_args = {"token": token, "object_name": object_name}
if task_order_id: if task_order_id:
task_order = TaskOrders.get(task_order_id) task_order = TaskOrders.get(task_order_id)
portfolio_id = task_order.portfolio_id portfolio_id = task_order.portfolio_id

View File

@ -20,12 +20,6 @@ export default {
props: { props: {
name: String, name: String,
token: {
type: Object,
},
objectName: {
type: String,
},
initialData: { initialData: {
type: String, type: String,
}, },
@ -52,8 +46,7 @@ export default {
} }
}, },
created: function() { created: async function() {
this.uploader = buildUploader(this.token)
emitEvent('field-mount', this, { emitEvent('field-mount', this, {
optional: this.optional, optional: this.optional,
name: this.name, name: this.name,
@ -71,13 +64,12 @@ export default {
return return
} }
const response = await this.uploader.upload(file, this.objectName) const uploader = await this.getUploader()
const response = await uploader.upload(file, this.objectName)
if (response.ok) { if (response.ok) {
this.attachment = e.target.value this.attachment = e.target.value
this.$refs.attachmentFilename.value = file.name this.$refs.attachmentFilename.value = file.name
this.$refs.attachmentObjectName.value = this.objectName this.$refs.attachmentObjectName.value = response.objectName
this.$refs.attachmentInput.disabled = true
} else { } else {
this.uploadError = true this.uploadError = true
} }
@ -111,6 +103,11 @@ export default {
this.uploadError = false this.uploadError = false
this.sizeError = false this.sizeError = false
}, },
getUploader: async function() {
return fetch('/upload-token')
.then(response => response.json())
.then(({ token }) => buildUploader(token))
},
}, },
computed: { computed: {

View File

@ -34,7 +34,7 @@ class AzureUploader {
if (err) { if (err) {
resolve({ ok: false }) resolve({ ok: false })
} else { } else {
resolve({ ok: true }) resolve({ ok: true, objectName })
} }
} }
) )
@ -57,10 +57,12 @@ class AwsUploader {
form.append('file', file) form.append('file', file)
form.set('x-amz-meta-filename', file.name) form.set('x-amz-meta-filename', file.name)
return fetch(this.presignedPost.url, { const response = await fetch(this.presignedPost.url, {
method: 'POST', method: 'POST',
body: form, body: form,
}) })
return { ok: response.ok, objectName }
} }
} }
@ -70,7 +72,7 @@ class MockUploader {
} }
async upload(file, objectName) { async upload(file, objectName) {
return Promise.resolve({ ok: true }) return Promise.resolve({ ok: true, objectName })
} }
} }

View File

@ -11,8 +11,6 @@
v-bind:watch='{{ watch | string | lower }}' v-bind:watch='{{ watch | string | lower }}'
name='{{ field.name }}' name='{{ field.name }}'
:optional='false' :optional='false'
v-bind:token='{{ token | tojson }}'
v-bind:object-name='"{{ object_name | string }}"'
> >
<div> <div>
<div v-show="hasAttachment" class="uploaded-file"> <div v-show="hasAttachment" class="uploaded-file">