首页 > 其他分享 >vue实现文件上传与下载

vue实现文件上传与下载

时间:2023-10-26 13:34:05浏览次数:35  
标签:文件 vue log ext file new 上传 下载

一、文件上传(多个文件上传)

 

  1、文件上传弹窗代码:

<!--================================上传文件弹窗=========================-->
        <el-dialog :title="addFileTitleName" :visible.sync="dialogAddFile" width="500px" style="padding:0;" @close="resetAddFile" >
            <el-input v-model="addFileName" autocomplete="off" size="small" style="width: 300px; display: none;" ></el-input>

            <div class="add-file-right" >
                <input type="file" ref="clearFile" @change="getFile($event)" multiple="multiplt" class="add-file-right-input" style="margin-left:70px;" accept=".docx,.doc,.xls,.xlsx,.ppt,.pptx,.pdf,.txt">
                <div style="margin-top: 20px;">
                    <span class="add-file-right-more">支持扩展名:.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,txt </span>
                </div>
            </div>
            <div class="add-file-list">
                <ul>
                    <li v-for="(item, index) in addArr" :key="index"><a >{{item.name}}</a></li>
                </ul>
            </div>
            <div slot="footer" class="dialog-footer">
                <el-button type="primary" @click="submitAddFile" size="small">开始上传</el-button>
                <el-button @click="resetAddFile" size="small">全部删除</el-button>
            </div>
        </el-dialog>

  

 

  2、文件上传对话框里面对应的参数和上传方法,js代码:

 //============上传文件参数初始化==========================================
  dialogAddFile: false,//上传文件弹窗
  addFileTitleName: "上传文件窗口",
  addFileName: "",
  addArr: [],




三个js方法:
//==================上传文件操作函数=============================================
getFile(event){ //获取上传文件方法
var file = event.target.files;
for(var i = 0;i<file.length;i++){
// 上传类型判断
var imgName = file[i].name;
var idx = imgName.lastIndexOf(".");
if (idx != -1){
var ext = imgName.substr(idx+1).toUpperCase();
ext = ext.toLowerCase( );
//pdg,doc,docx.xls,.xlsx,.ppt,pptx,
if (ext!='pdf' && ext!='doc' && ext!='docx' && ext!='xls' && ext!='xlsx' && ext!='ppt' && ext!='pptx' && ext!='txt'){

}else{
this.addArr.push(file[i]);
}
}else{

}
}
},


submitAddFile(){ //===========提交上传文件到后台保存方法
if(0 == this.addArr.length){
this.$message({
type: 'info',
message: '请选择要上传的文件'
});
return;
}

var formData = new FormData();
for(var i=0;i<this.addArr.length;i++){
formData.append('files',this.addArr[i]);
}
let config = {
headers: { "Content-Type": "multipart/form-data" }
};
console.log(formData);
  //接口请求使用的是自己封装了一下的axios
this.$http.post('/xxxx/uploadMyFile', formData, config).then(res => {
console.log(res);

this.$message({
message: '操作成功',
type: 'success'
});

}).catch((error) => {
alert("操作失败,出现错误:" + error)

});

},

//清除上传的文件方法
resetAddFile(){
this.addFileName = "";
this.addArr =[];
},


 

  3、java后端接口代码:

/**
     * (上传文件)
     * @param file
     * @return
     */
    @RequestMapping( value = "/uploadMyFile", method = RequestMethod.POST)
    @ResponseBody
    public ResultBase<String> uploadMyFile(@RequestParam(value = "files" , required = true) MultipartFile[] files){
        log.info("uploadImg方法上传图片开始");
        ResultBase<String> rb = new ResultBase<String>();
        try {

            log.info("调试打印:" + files.clone());


            rb.setCode(0);
        } catch (Exception e) {
            rb.setCode(1);
            log.error("uploadMyFile方法操作异常:" + e);
        }

        return rb;
    }

 

  

  =============亲测无误,前端效果图==========================

 

 

 

 

 

二、文件下载====================================================================================================

 重点记下:

  cao,cao,cao,使用axios请求有个巨坑,在百度了很多次后发现axios不管用get还是用post请求,后端代码控制浏览器弹出下载是无效的,导致要在请求返回结果的数据流里用js转成Blob对象,再用js调起浏览器的下载弹窗,代码示例如下:

  【文件下载虽然实现了,巨坑就来了,用这块代码下载的文件内容中文的全是乱码,不管在java代码怎么设置repsonse的编码格式,没    一   点   卵    用】

this.$http.get('/xxxx/downMyFile').then(res => {
                    console.log("下载文件返回res");
                    console.log(res);
                    if(!res.data){
                        this.$message.error("下载内容为空");
                        return;
                    }
                    let url = window.URL.createObjectURL(new Blob([res.data], {type: 'application/octet-stream'}));
                    let link = document.createElement('a');
                    link.style.display = 'none';
                    link.href = url;

                    // const fileName = res.headers["content-disposition"].split(";")[1].split("=")[1];//文件名称
                    const fileName = obj.file_name;//文件名称
                    link.setAttribute('download', fileName);
                    document.body.appendChild(link);
                    link.click();

                    window.URL.revokeObjectURL(url);//释放url对象所占资源
                    document.body.removeChild(link);//用完删除

                    this.$message({
                        message: '操作成功',
                        type: 'success'
                    });


                }).catch((error) => {
                    alert("操作失败,出现错误:" + error)

                });

 

 

  最后怎么解决的呢,不用axios的请求,直接用window.location.href打开后端下载接口地址,完美解决:

var objParam = "?url=" + row.url + "&file_name="+row.file_name;  //地址后面带的参数,根据自己业务来

 window.location.href = 'xxx/xxxx/downloadMyFile'+objParam;

 

 

 

 后面java代码:

    @ApiOperation("")
    @RequestMapping(value = "/downloadMyFile", method = RequestMethod.GET)
    public void downloadMyFile(HttpServletRequest request, HttpServletResponse response) {

        log.info("downloadMyFile方法");

        try {

            String url = request.getParameter("url");
            String file_name = request.getParameter("file_name");

            ServletOutputStream os = null;
//            File file = new File("D:\\testSaveFile\\8ef7672a14ea4362b6bd48a1743b01c0测试上传文件.docx");
            File file = new File(savefilepath+url);     //savefilepath:为写死文件所在地址:D:\\testSaveFile\\
//            String filename = file.getName();
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStream fis = new BufferedInputStream(fileInputStream);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.setContentType("text/html;charset=utf-8");
            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
    //      filename=filenameEncoding(filename,request);
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file_name, "UTF-8"));
            // 告知浏览器文件的大小
            response.addHeader("Content-Length", "" + file.length());
            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            outputStream.write(buffer);
            outputStream.flush();
            outputStream.close();


        } catch (Exception e) {
            log.error("uploadMyFile方法操作异常:" + e);
        }

 

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/26/vue%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8e%e4%b8%8b%e8%bd%bd/

欢迎入群一起讨论

 

 

标签:文件,vue,log,ext,file,new,上传,下载
From: https://www.cnblogs.com/songsu/p/17789191.html

相关文章

  • python博客园下载所有文章保存为Mardown
    简易代码importrequestsfrombs4importBeautifulSoupimportreimporthtml2textimportossession=requests.session()cookies={#换成自己的cookies}headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/av......
  • JAVASCRIPT 上传文件的几种方式
    方法1:使用ajax,通过formdata传参//注意:FormData只兼容到IE10varformData=newFormData();varfile=$('.import-file-btn').get(0).files[0];formData.append('file',file);formData.append('id',id);formData.append('name',name)......
  • 需要使用WinDbg工具来分析windows系统产生的dump文件,此工具属于Windows SDK的一个组件
    需要使用WinDbg工具来分析windows系统产生的dump文件,此工具属于WindowsSDK的一个组件,在微软官方网站可以下载(链接)。 使用WinDbg分析Windowsdump文件方法_windbg分析dump文件_谁能懂我2011的博客-CSDN博客......
  • vue3项目创建
    1.确保npm指令能够运行-官网下载nodejs Download|Node.js(nodejs.org) 安装完成后重启intellij2.终端输入npminstall-gcreate-vue3.终端输入create-vue新建vue项目根据需要设置功能,例:4.打开新建vue项目中的README,点击npminstall前的绿色箭头,在t......
  • vue打包部署遇到的问题
    网站上线中遇到的问题(跨域,404,空白页解决方案)因为本人是后端开发工程师,对前端开发不了解,踩了很多坑,所以将踩过的坑分享出来,以供参考网站地址:这里这段时间将项目部署到服务器中引发了几个问题第一个问题:跨域一般跨域是由后端来解决的,但是由于项目中加入了追踪请求的日志,频繁o......
  • 开发实例:后端Java和前端vue实现文件上传和下载功能
    首先,在Java的后端代码中,我们可以使用Spring框架来实现文件上传和下载功能。以下是一个简单的示例:文件上传首先,我们需要在html页面上创建一个表单,其中包含一个file类型的输入字段:<formaction="/upload"method="POST"enctype="multipart/form-data"><inputtype=......
  • Java - InputStream流Http客户端文件上传
    场景:两个系统文件服务不同,需从另外一个系统中下载文件并上传到另外一个系统中。代码实现//远程服务下载文件Responseresponse=fileCenterService.downloadFile(fileId);InputStreaminputStream=response.body().asInputStream();//调用接口上传到文件服务HttpClienth......
  • vue3 vite 根据目录生成路由
    vite勾选vue-router搭建好项目后,routes部分示例代码为routes:[{path:'/',name:'home',component:HomeView},{path:'/about',name:'about',//routelevelcode-splitting......
  • VSCode下载安装
    下载安装1.双击安装程序,勾选同意协议,点击下一步。 2.选安装地址   3.继续下一步 4.创建桌面快捷方式 5.安装           使用VSCode的教程参考链接:史上最全vscode配置使用教程-知乎(zhihu.com) ......
  • 使用vite自动生成vue路由
    全新的路由组织方式以往编写路由都需要手动编写router.js代码,其实很多代码是重复的新的方案根据文件夹目录结构自动生成文件夹下的index.vue->/初始化项目构建npminitvue@latest运行npmrundev项目结构一个文件夹对应一个路由page.js用来填写配置信息exportdefault{ti......