diff --git a/keyserver/src/fetchers/message-fetchers.js b/keyserver/src/fetchers/message-fetchers.js
--- a/keyserver/src/fetchers/message-fetchers.js
+++ b/keyserver/src/fetchers/message-fetchers.js
@@ -227,7 +227,9 @@
   const messageSpec = messageSpecs[type];
 
   if (type === messageTypes.IMAGES || type === messageTypes.MULTIMEDIA) {
-    const media = rows.filter(row => row.uploadID).map(mediaFromRow);
+    const media = await Promise.all(
+      rows.filter(row => row.uploadID).map(mediaFromRow),
+    );
     const [row] = rows;
     const localID = localIDFromCreationString(viewer, row.creation);
     invariant(
diff --git a/keyserver/src/fetchers/upload-fetchers.js b/keyserver/src/fetchers/upload-fetchers.js
--- a/keyserver/src/fetchers/upload-fetchers.js
+++ b/keyserver/src/fetchers/upload-fetchers.js
@@ -79,7 +79,7 @@
   return `${baseDomain}${basePath}upload/${id}/${secret}`;
 }
 
-function mediaFromRow(row: Object): Media {
+async function mediaFromRow(row: Object): Promise<Media> {
   const { uploadType: type, uploadSecret: secret } = row;
   const { width, height, loop } = row.uploadExtra;
   const id = row.uploadID.toString();
@@ -107,7 +107,7 @@
     WHERE id IN (${mediaIDs}) AND uploader = ${viewer.id} AND container IS NULL
   `;
   const [result] = await dbQuery(query);
-  return result.map(mediaFromRow);
+  return await Promise.all(result.map(mediaFromRow));
 }
 
 export {