aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2020-02-11 15:48:06 -0500
committerSam Wilkins <samwilkins333@gmail.com>2020-02-11 15:48:06 -0500
commitec5c878fb4c5f7e03fdd214c0841cf2ebf983e8c (patch)
tree35ac2ab43ed6122256de97fb2b302b038c8b430a
parented947b320de772d63e7b462e78910db11c0a8fd3 (diff)
refactored image upload data response format, google docs working for specific interactions
-rw-r--r--src/client/util/Import & Export/DirectoryImportBox.tsx4
-rw-r--r--src/client/util/RichTextSchema.tsx1
-rw-r--r--src/client/views/collections/CollectionSubView.tsx8
-rw-r--r--src/client/views/nodes/DocumentView.tsx4
-rw-r--r--src/client/views/nodes/ImageBox.tsx4
-rw-r--r--src/new_fields/RichTextUtils.ts30
-rw-r--r--src/scraping/buxton/final/json/buxton.json130
-rw-r--r--src/server/ApiManagers/DownloadManager.ts2
-rw-r--r--src/server/DashUploadUtils.ts37
-rw-r--r--src/server/apis/google/GooglePhotosUploadUtils.ts3
10 files changed, 121 insertions, 102 deletions
diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx
index 071015193..d04f56e57 100644
--- a/src/client/util/Import & Export/DirectoryImportBox.tsx
+++ b/src/client/util/Import & Export/DirectoryImportBox.tsx
@@ -120,8 +120,8 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>
runInAction(() => this.completed += batch.length);
});
- await Promise.all(uploads.map(async ({ name, type, clientAccessPath, exifData }) => {
- const path = Utils.prepend(clientAccessPath);
+ await Promise.all(uploads.map(async ({ name, type, accessPaths, exifData }) => {
+ const path = Utils.prepend(accessPaths.agnostic.client);
const document = await Docs.Get.DocumentFromType(type, path, { _width: 300, title: name });
const { data, error } = exifData;
if (document) {
diff --git a/src/client/util/RichTextSchema.tsx b/src/client/util/RichTextSchema.tsx
index f12b3632c..3cf0561dc 100644
--- a/src/client/util/RichTextSchema.tsx
+++ b/src/client/util/RichTextSchema.tsx
@@ -133,6 +133,7 @@ export const nodes: { [index: string]: NodeSpec } = {
inline: true,
attrs: {
src: {},
+ agnostic: { default: null },
width: { default: 100 },
alt: { default: null },
title: { default: null },
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index 293a8491a..20941493f 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -232,8 +232,8 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
const split = img.split("src=\"")[1].split("\"")[0];
let source = split;
if (split.startsWith("data:image") && split.includes("base64")) {
- const [{ clientAccessPath }] = await Networking.PostToServer("/uploadRemoteImage", { sources: [split] });
- source = Utils.prepend(clientAccessPath);
+ const [{ accessPaths }] = await Networking.PostToServer("/uploadRemoteImage", { sources: [split] });
+ source = Utils.prepend(accessPaths.agnostic.client);
}
const doc = Docs.Create.ImageDocument(source, { ...options, _width: 300 });
ImageUtils.ExtractExif(doc);
@@ -312,9 +312,9 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
const dropFileName = file ? file.name : "-empty-";
promises.push(Networking.PostFormDataToServer("/uploadFormData", formData).then(results => {
results.map(action((result: any) => {
- const { clientAccessPath, nativeWidth, nativeHeight, contentSize } = result;
+ const { accessPaths, nativeWidth, nativeHeight, contentSize } = result;
const full = { ...options, _width: 300, title: dropFileName };
- const pathname = Utils.prepend(clientAccessPath);
+ const pathname = Utils.prepend(accessPaths.agnostic.client);
Docs.Get.DocumentFromType(type, pathname, full).then(doc => {
if (doc) {
const proto = Doc.GetProto(doc);
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index e4ab3e746..5c5a87cb9 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -277,7 +277,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
preventDefault && e.preventDefault();
}
- })
+ });
buttonClick = async (altKey: boolean, ctrlKey: boolean) => {
const linkDocs = DocListCast(this.props.Document.links);
@@ -636,7 +636,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
if (StrCast(tempDoc.title) === layout) {
foundLayout = tempDoc;
}
- })
+ });
DocumentView.
makeCustomViewClicked(this.props.Document, this.props.DataDoc, Docs.Create.StackingDocument, layout, foundLayout);
} else {
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index db9800de4..c0e102195 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -321,12 +321,12 @@ export class ImageBox extends DocAnnotatableComponent<FieldViewProps, ImageDocum
const { dataDoc } = this;
const { success, failure, idle, loading } = uploadIcons;
runInAction(() => this.uploadIcon = loading);
- const [{ clientAccessPath }] = await Networking.PostToServer("/uploadRemoteImage", { sources: [primary] });
+ const [{ accessPaths }] = await Networking.PostToServer("/uploadRemoteImage", { sources: [primary] });
dataDoc.originalUrl = primary;
let succeeded = true;
let data: ImageField | undefined;
try {
- data = new ImageField(Utils.prepend(clientAccessPath));
+ data = new ImageField(Utils.prepend(accessPaths.agnostic.client));
} catch {
succeeded = false;
}
diff --git a/src/new_fields/RichTextUtils.ts b/src/new_fields/RichTextUtils.ts
index 016bcc4ca..7c1fc39d8 100644
--- a/src/new_fields/RichTextUtils.ts
+++ b/src/new_fields/RichTextUtils.ts
@@ -114,6 +114,7 @@ export namespace RichTextUtils {
width: number;
title: string;
url: string;
+ agnostic: string;
}
const parseInlineObjects = async (document: docs_v1.Schema$Document): Promise<Map<string, ImageTemplate>> => {
@@ -135,17 +136,17 @@ export namespace RichTextUtils {
for (let i = 0; i < objects.length; i++) {
const object = objects[i];
- const { clientAccessPath } = uploads[i];
+ const { accessPaths } = uploads[i];
+ const { agnostic, _m } = accessPaths;
const embeddedObject = object.inlineObjectProperties!.embeddedObject!;
const size = embeddedObject.size!;
const width = size.width!.magnitude!;
- const ext = extname(clientAccessPath);
- const url = Utils.prepend(clientAccessPath.replace(ext, "_m" + ext));
inlineObjectMap.set(object.objectId!, {
title: embeddedObject.title || `Imported Image from ${document.title}`,
width,
- url
+ url: Utils.prepend(_m.client),
+ agnostic: Utils.prepend(agnostic.client)
});
}
}
@@ -267,19 +268,19 @@ export namespace RichTextUtils {
};
const imageNode = (schema: any, image: ImageTemplate, textNote: Doc) => {
- const { url: src, width } = image;
+ const { url: src, width, agnostic } = image;
let docid: string;
- const guid = Utils.GenerateDeterministicGuid(src);
+ const guid = Utils.GenerateDeterministicGuid(agnostic);
const backingDocId = StrCast(textNote[guid]);
if (!backingDocId) {
- const backingDoc = Docs.Create.ImageDocument(src, { _width: 300, _height: 300 });
+ const backingDoc = Docs.Create.ImageDocument(agnostic, { _width: 300, _height: 300 });
DocumentView.makeCustomViewClicked(backingDoc, undefined, Docs.Create.FreeformDocument);
docid = backingDoc[Id];
textNote[guid] = docid;
} else {
docid = backingDocId;
}
- return schema.node("image", { src, width, docid, float: null, location: "onRight" });
+ return schema.node("image", { src, agnostic, width, docid, float: null, location: "onRight" });
};
const textNode = (schema: any, run: docs_v1.Schema$TextRun) => {
@@ -435,7 +436,7 @@ export namespace RichTextUtils {
const width = attrs.width;
requests.push(await EncodeImage({
startIndex: position + nodeSize - 1,
- uri: attrs.src,
+ uri: attrs.agnostic,
width: Number(typeof width === "string" ? width.replace("px", "") : width)
}));
}
@@ -498,15 +499,18 @@ export namespace RichTextUtils {
};
};
- const EncodeImage = async (information: ImageInformation) => {
- const source = [Docs.Create.ImageDocument(information.uri)];
+ const EncodeImage = async ({ uri, width, startIndex }: ImageInformation) => {
+ if (!uri) {
+ return {};
+ }
+ const source = [Docs.Create.ImageDocument(uri)];
const baseUrls = await GooglePhotos.Transactions.UploadThenFetch(source);
if (baseUrls) {
return {
insertInlineImage: {
uri: baseUrls[0],
- objectSize: { width: { magnitude: information.width, unit: "PT" } },
- location: { index: information.startIndex }
+ objectSize: { width: { magnitude: width, unit: "PT" } },
+ location: { index: startIndex }
}
};
}
diff --git a/src/scraping/buxton/final/json/buxton.json b/src/scraping/buxton/final/json/buxton.json
index 5c2e2c90c..16b28916b 100644
--- a/src/scraping/buxton/final/json/buxton.json
+++ b/src/scraping/buxton/final/json/buxton.json
@@ -18,9 +18,9 @@
"3DCad_Brochure.jpg"
],
"__images": [
- "/files/images/buxton/upload_19ce4ebd-f207-4724-b8bf-610c8e1cf322.png",
- "/files/images/buxton/upload_4dde8de0-f1ec-4ffb-b7cc-57b8c4ae6c94.png",
- "/files/images/buxton/upload_825e8ed8-063c-428b-917d-eb62ea218f05.png"
+ "/files/images/buxton/upload_793981b0-d7da-45d1-a643-596cc3834166.png",
+ "/files/images/buxton/upload_6259e28a-055e-4b02-b547-e72c5e6fa3c0.png",
+ "/files/images/buxton/upload_4f4fb80f-467a-41e7-9bf5-1b1f377b2ec4.png"
],
"title": "3Dconnexion CadMan 3D Motion Controller",
"company": "3Dconnexion",
@@ -63,11 +63,11 @@
"SpaceMouse_Plus_Info_Sheet.jpg"
],
"__images": [
- "/files/images/buxton/upload_f84cb54e-9bdb-4fbc-9503-6cfa8ddd65be.jpg",
- "/files/images/buxton/upload_506b5361-a9fd-4440-a19b-5b4af461878a.png",
- "/files/images/buxton/upload_60380383-3603-4624-98cf-50a0d4afe4c9.png",
- "/files/images/buxton/upload_2fad6fb2-f1e1-4fe3-915b-33586f05fcad.png",
- "/files/images/buxton/upload_effcd815-49eb-4cd4-82cf-2519e58eb729.png"
+ "/files/images/buxton/upload_4a6cbfa8-964b-41d3-9f24-7d1aed22cd79.jpg",
+ "/files/images/buxton/upload_8c33d572-07da-4599-944c-eb2370b16a63.png",
+ "/files/images/buxton/upload_9afc5cca-6208-4944-a0f6-1c3fcd41fdcf.png",
+ "/files/images/buxton/upload_74e79798-9c9e-4c54-b42f-5813f218bc63.png",
+ "/files/images/buxton/upload_2bea6876-dc4e-4681-a1d3-433caec163c1.png"
],
"title": "3Dconnexion Magellan/SpaceMouse Plus",
"company": "3Dconnexion",
@@ -114,13 +114,13 @@
"SpaceBall_5000_Data_Sheet.jpg"
],
"__images": [
- "/files/images/buxton/upload_81972990-8cad-4299-926a-fe5d49711a80.jpg",
- "/files/images/buxton/upload_04103620-72e4-431f-b34f-61d0f158277a.png",
- "/files/images/buxton/upload_9bfe7c5a-1c5e-46e3-8f8d-4e0eec3e38e3.png",
- "/files/images/buxton/upload_77da85f5-6575-4a8d-acb6-52f2df3307b0.png",
- "/files/images/buxton/upload_1c041a33-b258-42d1-b9f2-d610a4838fb3.jpg",
- "/files/images/buxton/upload_841f0d98-27d7-4298-a71d-c5cba72a262a.jpg",
- "/files/images/buxton/upload_0e0eaf99-f8bb-4f02-ad46-651cd67c13b1.jpg"
+ "/files/images/buxton/upload_94e39580-5cca-46e9-ae49-ab6cd2fe3cad.jpg",
+ "/files/images/buxton/upload_eacee8a5-9849-4401-9c38-aa46fc0f517b.png",
+ "/files/images/buxton/upload_9b0b1f35-ac7c-4160-8806-8d243223872b.png",
+ "/files/images/buxton/upload_cf0c6e39-9ae6-48ce-90bd-d9f335503439.png",
+ "/files/images/buxton/upload_b4285b9f-26cd-4de5-8e37-c4e563c3e7f6.jpg",
+ "/files/images/buxton/upload_5b6ff31b-81b2-4a74-8591-27730c24225b.jpg",
+ "/files/images/buxton/upload_64dcea06-3b35-4979-bf40-5dfa5d4668b1.jpg"
],
"title": "3Dconnexion Spaceball 5000",
"company": "3Dconnexion",
@@ -171,13 +171,13 @@
"SpaceNavigator_Press_Release.jpg"
],
"__images": [
- "/files/images/buxton/upload_b44ec511-334e-46c0-a315-63d90fac8117.jpg",
- "/files/images/buxton/upload_734ae360-faaf-4c78-89b4-a3f120fe233e.png",
- "/files/images/buxton/upload_d20bbf6a-7310-407a-8b85-c607e9cf7f73.png",
- "/files/images/buxton/upload_e9236600-dd5f-4805-92ca-805d5a301aa1.jpg",
- "/files/images/buxton/upload_c85c977d-ef99-44be-b55c-8e8dde124e83.png",
- "/files/images/buxton/upload_a6034d66-7de6-4d4b-bd64-ea95cc00ae8a.png",
- "/files/images/buxton/upload_07415a65-964a-4936-aa6e-79861e8ebcbf.png"
+ "/files/images/buxton/upload_73511beb-f2bf-4f28-a1ea-64ef52a00426.jpg",
+ "/files/images/buxton/upload_4e088fb4-e5ff-4a1b-ba88-5f4575c86fe3.png",
+ "/files/images/buxton/upload_876a9921-3eb1-4c35-99e3-b82924fb88c4.png",
+ "/files/images/buxton/upload_d23c2886-c2b9-4558-9bfb-966aca7be20e.jpg",
+ "/files/images/buxton/upload_aef9171b-2e19-4fcb-b2dc-2281e89d498b.png",
+ "/files/images/buxton/upload_bbdaf252-1689-4680-8b19-ec5e79088e44.png",
+ "/files/images/buxton/upload_4cf49440-cf6b-484d-8391-3a2b0fae2b7e.png"
],
"title": "3Dconnexion SpaceNavigator ",
"company": "3Dconnexion",
@@ -222,12 +222,12 @@
"3M_2006_Catalogue_p18.jpg"
],
"__images": [
- "/files/images/buxton/upload_52b83c2a-5fe4-42aa-a488-5667b0a5beae.jpg",
- "/files/images/buxton/upload_e05d8710-d82b-4f3b-8940-3745db1c855c.jpg",
- "/files/images/buxton/upload_557c6fc7-04a3-4698-acde-4e53ceb6793c.jpg",
- "/files/images/buxton/upload_d9723beb-bfe3-4556-b17d-aedf2db59777.jpg",
- "/files/images/buxton/upload_5cb15815-3cab-406f-bf95-f9410997b4f4.jpg",
- "/files/images/buxton/upload_a7fc91e0-7672-4f81-a8f3-66072997bd44.jpg"
+ "/files/images/buxton/upload_02df5121-8eff-452c-a52b-a44238afc06d.jpg",
+ "/files/images/buxton/upload_169aa4ee-4c34-43a2-8302-48bb3b7a01b6.jpg",
+ "/files/images/buxton/upload_a4d11c27-e4fa-4912-96da-3d971ec49ca0.jpg",
+ "/files/images/buxton/upload_7e9e1862-72e7-4f0d-8451-36de8c1bbe9c.jpg",
+ "/files/images/buxton/upload_76fa705f-2470-439c-acf6-03482d7a9570.jpg",
+ "/files/images/buxton/upload_7b6dd2c9-b88f-4958-a4d0-94bb42172e26.jpg"
],
"title": "3M EM500 Ergonomic Mouse",
"company": "3M",
@@ -268,13 +268,13 @@
"Abaton_ProPoint_Brochure.jpg"
],
"__images": [
- "/files/images/buxton/upload_f6f038a9-3583-4d21-9a43-f762e1df0b52.jpg",
- "/files/images/buxton/upload_ad5f2bbd-66be-4dde-afe4-60e353a63f74.jpg",
- "/files/images/buxton/upload_2e384260-5d2b-47a4-9508-028462a5a1e7.jpg",
- "/files/images/buxton/upload_4dfcd3af-f06d-4c3e-8dff-7c43acd79a16.jpg",
- "/files/images/buxton/upload_19eea9af-abec-4617-8b8d-fcb6637420de.jpg",
- "/files/images/buxton/upload_89702b8a-fcb5-426d-b5af-c58e62d1c8ff.jpg",
- "/files/images/buxton/upload_44419996-994e-471c-8dc7-cda22b00ac24.jpg"
+ "/files/images/buxton/upload_37169968-d329-40c5-9483-6bc198edc43c.jpg",
+ "/files/images/buxton/upload_64731ea4-a3aa-43ec-a56d-d4f6ecba7cf0.jpg",
+ "/files/images/buxton/upload_c41feac8-3b98-4d85-b9c7-79b3482a0695.jpg",
+ "/files/images/buxton/upload_5f67807b-f61b-4816-b93f-6d88c95b2418.jpg",
+ "/files/images/buxton/upload_a3e3cab8-48ab-43c2-bed9-5cc0ce68928d.jpg",
+ "/files/images/buxton/upload_4c3ac379-6703-4c87-a4a0-ca450a1151d2.jpg",
+ "/files/images/buxton/upload_8df14dc0-d75d-41f0-9e70-a221598d3df3.jpg"
],
"title": "Abaton ProPoint Optical Trackball",
"company": "Abaton",
@@ -305,8 +305,8 @@
"Active_Book_Brochure_p1.jpg"
],
"__images": [
- "/files/images/buxton/upload_2159da7b-9ebd-41ed-8b60-9eb36a6c6685.jpg",
- "/files/images/buxton/upload_6d470914-fc41-4151-858b-f945807e62a2.png"
+ "/files/images/buxton/upload_9c8aa6a2-570f-4915-b840-504c8531c341.jpg",
+ "/files/images/buxton/upload_fbb7ad12-2a5d-4f76-89a9-ec30d7260031.png"
],
"title": "Active Book Company Active Book Prototype",
"company": "Active Book Company",
@@ -342,11 +342,11 @@
"Adesso_ACK-540PW_June 21_2003.jpg"
],
"__images": [
- "/files/images/buxton/upload_189469a3-1133-4a4f-8720-19c04f29684e.jpg",
- "/files/images/buxton/upload_73f5d066-f9b5-41ce-9ce3-e27253ef51e7.jpg",
- "/files/images/buxton/upload_498e5cbd-d65e-4b01-bed2-bcb2723ffee5.jpg",
- "/files/images/buxton/upload_97ee9d03-07e0-448c-89f6-6ac61948de68.jpg",
- "/files/images/buxton/upload_661e7387-dcd7-4ca1-8493-2e94f8803ef7.jpg"
+ "/files/images/buxton/upload_967656ff-44d7-4693-bcb0-dc0eab204413.jpg",
+ "/files/images/buxton/upload_9ffd4ccb-8ca5-4926-8fa2-38277b2ccfb6.jpg",
+ "/files/images/buxton/upload_22399981-f8c0-46e0-953c-89f7eb043ad2.jpg",
+ "/files/images/buxton/upload_15ad02a9-123f-4e7e-94c5-d959076520f0.jpg",
+ "/files/images/buxton/upload_8905097a-3568-4d37-9ad3-126a0e429f12.jpg"
],
"title": "Adesso ACK-540PB PS/2 Mini PS/2 Touchpad Keyboard",
"company": "Adesso",
@@ -405,17 +405,17 @@
"Adesso_KP_Mouse_11_Product.JPG"
],
"__images": [
- "/files/images/buxton/upload_0a127e30-9014-4300-bade-07945fba940f.jpg",
- "/files/images/buxton/upload_ca20611c-9061-4e56-9d72-4c4a3c798d3f.jpg",
- "/files/images/buxton/upload_12b46021-eeef-47f0-9e55-ca9e9b76f9e4.jpg",
- "/files/images/buxton/upload_5e86ad07-77af-4d3e-a82e-eaa9cafdbbe4.jpg",
- "/files/images/buxton/upload_4be64833-53e9-4216-b7ec-d521e0b87933.jpg",
- "/files/images/buxton/upload_7cb731b5-5c52-47e0-a33b-c113530478f2.jpg",
- "/files/images/buxton/upload_b20407b3-3578-4fa5-8f16-e0bf729e4daa.jpg",
- "/files/images/buxton/upload_bee2fcb8-702a-46aa-9ec3-eb9b50ef1ba7.jpg",
- "/files/images/buxton/upload_0ee0f6d5-34fc-41f3-9c8e-cf462dbcc40b.jpg",
- "/files/images/buxton/upload_8f442582-b901-4a38-8df6-5a9b3195df9f.jpg",
- "/files/images/buxton/upload_3f96763c-c3af-46a7-8831-3206c8bc460e.jpg"
+ "/files/images/buxton/upload_5bc99192-0935-4f6d-8d6c-a2218d55b359.jpg",
+ "/files/images/buxton/upload_52a6212e-c79d-4ec6-86a0-a3ca4ea54387.jpg",
+ "/files/images/buxton/upload_997acb64-0e08-4af2-b0e3-0b86a18bace5.jpg",
+ "/files/images/buxton/upload_00586980-0a08-43e1-9721-c2f5dcd1079e.jpg",
+ "/files/images/buxton/upload_3f695b11-dc1d-4d54-abec-eacfac80bdc7.jpg",
+ "/files/images/buxton/upload_161f1420-9594-4dca-ba62-1ca32e9a2028.jpg",
+ "/files/images/buxton/upload_a8b4ea6e-f1f8-47db-a796-72f566e60e6f.jpg",
+ "/files/images/buxton/upload_b6365e4e-4656-4bbf-aec6-feb920be6df9.jpg",
+ "/files/images/buxton/upload_1a0e9061-39e1-4dec-8add-5cc1abd110b5.jpg",
+ "/files/images/buxton/upload_d9bba544-f2b1-4a15-81e5-0d10e60d7881.jpg",
+ "/files/images/buxton/upload_56d486df-d7bb-44b0-80ad-c41c63590bae.jpg"
],
"title": "Adesso 2-in-1 Optical Keypad Calculator Mouse AKP-170",
"company": "Adesso Inc",
@@ -477,18 +477,18 @@
"NB75D_Mouse_Manual.jpg"
],
"__images": [
- "/files/images/buxton/upload_dae8f950-38bf-4fdf-8db0-153e3cae9cae.jpg",
- "/files/images/buxton/upload_3e054d83-d01f-4d3d-aad2-fa8ee1d22a97.jpg",
- "/files/images/buxton/upload_e9c2ddb0-0684-4bb4-a88c-5ee8074e456e.jpg",
- "/files/images/buxton/upload_9c829a69-7d45-4d25-b906-98153aa03001.jpg",
- "/files/images/buxton/upload_4faa425c-a100-4ce4-869c-a6c6705779ee.jpg",
- "/files/images/buxton/upload_ed20ac31-69f6-45b8-b8e0-b8ad829ba002.jpg",
- "/files/images/buxton/upload_f3d3d8f5-01cf-4cd1-9d1c-0a11a8c3e239.jpg",
- "/files/images/buxton/upload_af1fa3b6-4537-416a-b626-34bed1154f35.jpg",
- "/files/images/buxton/upload_5127f377-b697-4ad7-9fb3-fd6f82017c3c.jpg",
- "/files/images/buxton/upload_061ae6a2-e083-492a-bc8a-826c4be00790.jpg",
- "/files/images/buxton/upload_32e91966-7f1b-4cd7-858b-9cdb63affd13.jpg",
- "/files/images/buxton/upload_ccc9de21-b047-4f9c-89c6-08fb3d206c7a.jpg"
+ "/files/images/buxton/upload_2db5c520-b370-4f03-8481-908e42428466.jpg",
+ "/files/images/buxton/upload_b28643eb-57a0-4602-b7cc-c41d553628b9.jpg",
+ "/files/images/buxton/upload_2478a89a-4eea-4e4c-af83-ecd292f44f3d.jpg",
+ "/files/images/buxton/upload_113d7356-f550-4491-849d-f69087c73918.jpg",
+ "/files/images/buxton/upload_44c40c44-ade6-499d-951c-4b436131e66e.jpg",
+ "/files/images/buxton/upload_d91f9756-09bc-447f-8f04-dc78344a5f11.jpg",
+ "/files/images/buxton/upload_b8c51011-5f93-43f3-85aa-b611a3b3cf93.jpg",
+ "/files/images/buxton/upload_483544a3-c3f7-4c8f-a236-def10d32f4f0.jpg",
+ "/files/images/buxton/upload_ea048294-3f57-42c3-b5b4-27062a5755dc.jpg",
+ "/files/images/buxton/upload_8eb1b9b1-9ca3-49c8-9bd4-7302a9c1f07e.jpg",
+ "/files/images/buxton/upload_029aa1d6-056d-4cf0-8eaf-b23b3d0e4317.jpg",
+ "/files/images/buxton/upload_3acc0955-da14-4a53-ac58-2e494e04ca78.jpg"
],
"title": "A4 Tech BatteryFREE Wireless Optical Mouse Model NB-75D",
"company": "A4Tech",
diff --git a/src/server/ApiManagers/DownloadManager.ts b/src/server/ApiManagers/DownloadManager.ts
index fad5e6789..01d2dfcad 100644
--- a/src/server/ApiManagers/DownloadManager.ts
+++ b/src/server/ApiManagers/DownloadManager.ts
@@ -254,7 +254,7 @@ async function writeHierarchyRecursive(file: Archiver.Archiver, hierarchy: Hiera
// and dropped in the browser and thus hosted remotely) so we upload it
// to our server and point the zip file to it, so it can bundle up the bytes
const information = await DashUploadUtils.UploadImage(result);
- path = information instanceof Error ? "" : information.serverAccessPaths[SizeSuffix.Original];
+ path = information instanceof Error ? "" : information.accessPaths[SizeSuffix.Original].server;
}
// write the file specified by the path to the directory in the
// zip file given by the prefix.
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index 83a0064e8..0f1758c26 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -61,13 +61,16 @@ export namespace DashUploadUtils {
const type = "content-type";
export interface ImageUploadInformation {
- clientAccessPath: string;
- serverAccessPaths: { [key: string]: string };
+ accessPaths: AccessPathInfo;
exifData: EnrichedExifData;
contentSize?: number;
contentType?: string;
}
+ export interface AccessPathInfo {
+ [suffix: string]: { client: string, server: string };
+ }
+
const { imageFormats, videoFormats, applicationFormats } = AcceptibleMedia;
export async function upload(file: File): Promise<any> {
@@ -94,7 +97,7 @@ export namespace DashUploadUtils {
}
console.log(red(`Ignoring unsupported file (${name}) with upload type (${type}).`));
- return { clientAccessPath: undefined };
+ return { accessPaths: undefined };
}
async function UploadPdf(absolutePath: string) {
@@ -213,29 +216,40 @@ export namespace DashUploadUtils {
};
};
- export async function MoveParsedFile(absolutePath: string, destination: Directory): Promise<{ clientAccessPath: Opt<string> }> {
- return new Promise<{ clientAccessPath: Opt<string> }>(resolve => {
+ export async function MoveParsedFile(absolutePath: string, destination: Directory): Promise<Opt<AccessPathInfo>> {
+ return new Promise<Opt<AccessPathInfo>>(resolve => {
const filename = basename(absolutePath);
const destinationPath = serverPathToFile(destination, filename);
rename(absolutePath, destinationPath, error => {
- resolve({ clientAccessPath: error ? undefined : clientPathToFile(destination, filename) });
+ resolve(error ? undefined : {
+ agnostic: getAccessPaths(destination, filename)
+ });
});
});
}
+ function getAccessPaths(directory: Directory, fileName: string) {
+ return {
+ client: clientPathToFile(directory, fileName),
+ server: serverPathToFile(directory, fileName)
+ };
+ }
+
export const UploadInspectedImage = async (metadata: InspectionResults, filename?: string, prefix = "", cleanUp = true): Promise<ImageUploadInformation> => {
const { requestable, source, ...remaining } = metadata;
const extension = `.${remaining.contentType.split("/")[1].toLowerCase()}`;
const resolved = filename || `${prefix}upload_${Utils.GenerateGuid()}${extension}`;
+ const { images } = Directory;
const information: ImageUploadInformation = {
- clientAccessPath: clientPathToFile(Directory.images, resolved),
- serverAccessPaths: {},
+ accessPaths: {
+ agnostic: getAccessPaths(images, resolved)
+ },
...remaining
};
const outputPath = pathToDirectory(Directory.images);
const writtenFiles = await outputResizedImages(() => request(requestable), outputPath, resolved, extension);
for (const suffix of Object.keys(writtenFiles)) {
- information.serverAccessPaths[suffix] = serverPathToFile(Directory.images, writtenFiles[suffix]);
+ information.accessPaths[suffix] = getAccessPaths(images, writtenFiles[suffix]);
}
if (isLocal().test(source) && cleanUp) {
unlinkSync(source);
@@ -270,10 +284,9 @@ export namespace DashUploadUtils {
export async function outputResizedImages(readStreamSource: () => ReadStreamLike | Promise<ReadStreamLike>, outputPath: string, fileName: string, ext: string) {
const writtenFiles: { [suffix: string]: string } = {};
for (const { resizer, suffix } of resizers(ext)) {
- const resizedPath = path.resolve(outputPath, InjectSize(fileName, suffix));
- writtenFiles[suffix] = resizedPath;
+ const resolved = writtenFiles[suffix] = InjectSize(fileName, suffix);
await new Promise<void>(async (resolve, reject) => {
- const writeStream = createWriteStream(resizedPath);
+ const writeStream = createWriteStream(path.resolve(outputPath, resolved));
let readStream: ReadStreamLike;
const source = readStreamSource();
if (source instanceof Promise) {
diff --git a/src/server/apis/google/GooglePhotosUploadUtils.ts b/src/server/apis/google/GooglePhotosUploadUtils.ts
index 8ae63caa3..d305eed0a 100644
--- a/src/server/apis/google/GooglePhotosUploadUtils.ts
+++ b/src/server/apis/google/GooglePhotosUploadUtils.ts
@@ -84,6 +84,7 @@ export namespace GooglePhotosUploadUtils {
if (!DashUploadUtils.validateExtension(url)) {
return undefined;
}
+ const body = await request(url, { encoding: null }); // returns a readable stream with the unencoded binary image data
const parameters = {
method: 'POST',
uri: prepend('uploads'),
@@ -92,7 +93,7 @@ export namespace GooglePhotosUploadUtils {
'X-Goog-Upload-File-Name': filename || path.basename(url),
'X-Goog-Upload-Protocol': 'raw'
},
- body: await request(url, { encoding: null }) // returns a readable stream with the unencoded binary image data
+ body
};
return new Promise((resolve, reject) => request(parameters, (error, _response, body) => {
if (error) {