How to download a locally stored file in VueJS

28,597

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 in public
  • I moved there the files I wanted to download and Voila, WORKED.

enter image description here <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>
Share:
28,597
Judd
Author by

Judd

Updated on October 17, 2021

Comments

  • Judd
    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:

    How to import and use image in a Vue single file component?

    What are the various "Build action" settings in Visual Studio project properties and what do they do?

  • Bhavin Kalal
    Bhavin Kalal over 3 years
    No, it does not word for word file tried doing that
  • Lovepreet Singh
    Lovepreet Singh over 2 years
    this works flawlessly
  • MattSom
    MattSom over 2 years
    This 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.