#How can I create a button that will download a specific .csv file that I have in storage?
4 messages · Page 1 of 1 (latest)
Hi @median spear. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave:
To create a button that downloads a specific .csv file from storage, you can follow these steps:
-
Write a Convex HTTP endpoint that runs a query to read the entire table, and formats it as a CSV and includes the appropriate headers to make it a download. This was suggested by a Trusted Support Staff in a Discord support thread (https://discord.com/channels/1019350475847499849/1249722016852869120).
-
You can also use
convex.query()to grab the data and handle the download on the client side. This approach was also suggested in the same Discord support thread (https://discord.com/channels/1019350475847499849/1249722016852869120). -
To serve the file, you can generate a URL pointing to the file. The simplest way to serve files is to return URLs along with other data required by your app from queries and mutations. A file URL can be generated from a storage ID by the
storage.getUrlfunction of theQueryCtx,MutationCtx, orActionCtxobject. You can find more details in the Convex documentation (https://docs.convex.dev/file-storage/serve-files).
Here is an example of how to generate a file URL in a query:
import { query } from "./_generated/server";
export const list = query({
args: {},
handler: async (ctx) => {
const messages = await ctx.db.query("messages").collect();
return Promise.all(
messages.map(async (message) => ({
...message,
// If the message is an "image" its `body` is an `Id<"_storage">`
...(message.format === "image"
? { url: await ctx.storage.getUrl(message.body) }
: {}),
})),
);
},
});
- Once you have the URL, you can use it in your frontend to create a download button. The specific implementation would depend on your frontend framework or library. For example, in HTML, you could create a link with the
downloadattribute:
<a href="YOUR_FILE_URL" download>Download</a>