How to download a locally stored file in VueJS
Solution 1
Thanks OverCoder, the solution was indeed to add a CSV Loader in order that adds the locally stored files to the webpack server. For anyone else using webpack, I added this module to my webpack.config.js file:
{
test: /\.(csv|xlsx|xls)$/,
loader: 'file-loader',
options: {
name: `files/[name].[ext]`
}
}
Then I could reference the file easily like this in my template,
<a href="/files/Template_Upload.csv" download>File Template</a>
or this
<a :href="item.loc" download>File Template</a>
using the same data return as I said. Using the require statement with the loader puts the "required" files into the wwwroot/files folder when the project builds. Thanks again, OverCoder, this saved me a lot of time.
Solution 2
For anyone which doesnt want to use webpack, I solved this issue:
- create a folder called
files
inpublic
- I moved there the files I wanted to download and Voila, WORKED.
<a href="/files/book.pdf" download>DOWNLOAD</a>
Solution 3
Just an extension to the @Judd's answer. If you don't have a webpack.config.js
, you can use the vue.config.js
file. (just create it in the root, if it doesn't exist)
vue.config.js
module.exports = {
configureWebpack: {
module: {
rules: [
{
test: /\.(csv|xlsx|xls)$/,
loader: 'file-loader',
options: {
name: `files/[name].[ext]`
}
}
],
},
},
};
Solution 4
This works for me;
<a href="../../assets/files/FileTemplate.csv" download>Download</a>
It behaves nicely even in dialogs.
Solution 5
Try this:
<a href="../../assets/files/FileTemplate.csv">Download</a>
Judd
Updated on October 17, 2021Comments
-
Judd over 2 years
I have an upload system and I am trying to supply a sample template for users. I have a template stored locally in a subfolder in assets, I would like to access that in my VueJS component and display a link to it on the page. These are the applicaple parts of the file structure:
├──app │ └──Components │ └──Uploader.vue └──assets └──files └──Template_Upload.csv
In Uploader.vue I have this line:
<a v-bind:href="item.loc" download>{{item.title}}</a>
And in the export I have this line
data() { return { item: {title: 'Upload Template', loc: require('../../assets/files/Template_Upload.csv')} }
This method works if I have an image. Upon clicking on the link, it downloads the image. However, if I use a .csv or a .xlsx file, errors are thrown upon opening the page. I've tried using
import fileTemplate from "../../assets/files/FileTemplate.csv";
As well, and using fileTemplate as the loc property. This also works if I use a picture. But I'm not able to bring in a document. Is this a limitation I can't get past or is there a different method I can try?
I've also gone into Visual Studio (in other words, the .csproj file), and set the Template_Upload.csv Build Action setting is set to "Content" and the Copy to Ouput Directory setting is set to "Copy Always".
These are the resources I have primarily used thus far:
-
Bhavin Kalal over 3 yearsNo, it does not word for word file tried doing that
-
Lovepreet Singh over 2 yearsthis works flawlessly
-
MattSom over 2 yearsThis is a bit obscure. What require statement? What is the exact folder structure it can see? The project I am working on is already quite sizeable and I am not sure I can just add any
assets
folder anywhere I'd like.