无奈,记录一次成功完成vue element ui upload上传文件结合struts2的骚操作,完美解决后台无法获得上传文件的问题

news/2024/7/10 2:02:42 标签: struts2, vue, upload

首先在这里不建议大家做这样的奇葩操作

如果你们有老系统必须要做这样的改造,那是无奈之举

先看代码,这些代码是我直接从我完成的项目中提取出来的可以直接使用,不过element ui这个空间布局我稍微做了css修改,这里就不贴出css了,这些代码之后会有完整解释,我会把我这次经历一一解释清楚如何一步一步填坑

<el-upload
         class="img-upload"
         ref="upload"
         name="itemfile"
         action="uploadProductPhoto"
         :headers="headers"
         :limit="1"
         :on-preview="handlePreview"
         :on-remove="handleRemove"
         <%--:file-list="fileList"--%>
         :on-progress="beforeAvatarUpload"
         :http-request="uploadFileMethod"
         :auto-upload="false">
      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
      <%--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>--%>
</el-upload>

 

var app = new Vue({
            el:'#app',
        data: {
            file: {},
         msg: '123',
//            fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}]
            fileList:[],
            progressPercent: 0,
            headers: {
//                'Content-Type': 'application/x-www-form-urlencoded'
//                'Content-Type': 'multipart/form-data'
         },
        },
        methods: {
            uploadFileMethod:function(param) {
                const fileObject = param.file;
                const formData = new FormData();
                formData.append("itemfile", param.file);
                formData.append("Filename", $('.el-upload-list__item-name').text().trim());
                const instance = axios.create({
                    baseURL: 'uploadProductPhoto.html?jsessionid=<%=request.getSession().getId()%>',
                    timeout: 10000,
                    headers: {
                        "Content-type": "multipart/form-data"
                    },

               onUploadProgress: function(progressEvent) {
                  var percent=(progressEvent.loaded / progressEvent.total * 100) | 0
                  //调用onProgress方法来显示进度条,需要传递个对象 percent为进度值
                        param.onProgress({percent:percent})
                  }
                });

                instance({
                    method: 'post',
                    headers: {
                        "Content-type": "multipart/form-data"
                    },
                    url: 'uploadProductPhoto.html?jsessionid=<%=request.getSession().getId()%>',
                    data: formData,
                }).then(function(res) {
                    param.onSuccess()
                    $("#errMsg").html(res.data);
                }).catch(function(err){
                    $("#errMsg").html(err.data);
                })

            },
            submitUpload:function() {
                this.loading=true;
                this.$refs.upload.submit();
            },
            handleRemove:function(file, fileList) {
                console.log(file, fileList);
            },
            handlePreview:function(file) {
                console.log(file);
            },
         beforeAvatarUpload:function(event, file, fileList){
                var loadProgress = Math.floor(event.percent) //这就是当前上传的进度
                this.progressPercent=loadProgress;
                $(".inner-progress").text(loadProgress+"%");
//          alert(loadProgress)
                //可以进行其他逻辑
            },
        }

        })
    ;

 一,我使用的element ui上传文件控件

一开始我也是直接从element ui官网直接copy如下图这个控件

 

后台是SSH java项目 ,以前用的是

<script language="javascript" type="text/javascript" src="js/uploadify2.1.4/swfobject.js"></script>
<script language="javascript" type="text/javascript" src="js/uploadify2.1.4/jquery.uploadify.v2.1.4.min.js"></script>

是可以正常的

现在jsp页面引入vue,确实骚是不是,引入vue和element ui的控件之后

后台就存在取不到上传的文件又没有

上传文件上传到后台是一个tmp文件,后台接收到后是需要再处理的

二、如何用vue+struts2处理传值和接收过程呢

以前的struts.xml文件中存在这么一个配置

<constant name="struts.multipart.saveDir" value="/tmp" />
<constant name="struts.multipart.maxSize" value="30072243" />

这个配置是struts.multipart.saveDir" value="/tmp存放零时文件的意思,但是在上传过程中,你断点调试取出这个路劲下的文件一看,100多个.tmp文件,哪个才是我们需要的?

答案这个配置肯定可以拿到上传过来的文件

只不过这个文件乱且多,还不知道具体的文件是哪个

我放弃了这样去取tmp

经过网上查找资料得知通过

axios的post可以实现,既是网络所说的
const fd = new FormData();
fd.append('Filename:', this.file.name)
axios.post('upload.html?jsessionid=<%=request.getSession().getId()%>',fd,{
    headers: {
            "Content-type": "multipart/form-data"
              }
             }).then(function(res){
                alert("上传成功");
             })

情况并没有得到很好的解决,后台还是取不到值,最后我又找到了添加以下这行代码 ,加了这行代码原来的进度条就没有了,我这里也进行了解决

:http-request="uploadFileMethod"

具体的js方法中如下这段

       uploadFileMethod:function(param) {
           const fileObject = param.file;
           const formData = new FormData();
           formData.append("itemfile", param.file);
           formData.append("Filename", $('.el-upload-list__item-name').text().trim());
           const instance = axios.create({
               baseURL: 'uploadProductPhoto.html?jsessionid=<%=request.getSession().getId()%>',
               timeout: 10000,
               headers: {
                   "Content-type": "multipart/form-data"
               },

onUploadProgress: function(progressEvent) {
   var percent=(progressEvent.loaded / progressEvent.total * 100) | 0
   //调用onProgress方法来显示进度条,需要传递个对象 percent为进度值
                   param.onProgress({percent:percent})
              }
           });

           instance({
               method: 'post',
               headers: {
                   "Content-type": "multipart/form-data"
               },
               url: 'uploadProductPhoto.html?jsessionid=<%=request.getSession().getId()%>',
               data: formData,
           }).then(function(res) {
               param.onSuccess()
               $("#errMsg").html(res.data);
           }).catch(function(err){
               $("#errMsg").html(err.data);
           })

       }

文件我通过formData.append("itemfile", param.file);

文件名称我通过

formData.append("Filename", $('.el-upload-list__item-name').text().trim());

设置进去

 

后台

HttpServletRequest request = ServletActionContext.getRequest();
MultiPartRequestWrapper req = (MultiPartRequestWrapper) request;
File[] itemfiles = req.getFiles("itemfile");

this.itemfileFileName = req.getParameter("Filename");

 

最后断点得到如下结果

 

后台为什么能拿到这些呢?因为这个action类他实现了

 implements ServletResponseAware, ServletRequestAware,
      SessionAware

以上几个类

 

最终结果

 

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/1464351.html

相关文章

解决windows版本Rabbitmq进入不了管理页面,启动报错Could not update enabled plugins file at ....

按照网上的步骤&#xff1a; 安装erlang 安装完rabbitmq 在rabbitmq安装目录下操作如下&#xff0c;且看结果 D:\RabbitMQServer\rabbitmq_server-3.7.14\sbin>rabbitmq-plugins enable rabbitmq_management Enabling plugins on node rabbitDESKTOP-8VK8LDV: rabbitmq_ma…

Jquery结合css写开关按钮,拨动开关

Jquery结合css写的开关 效果 CSS .choose-btn2 { display: none; } .choose-label2 { box-shadow: #b1b1b1 0px 0px 0px 1px; width: 52px; height: 26px; display: inline-block; border-radius: 16px; position: relative; background-color: #bdbdbd; overflow: hidden; ma…

uniapp开发父组件调用子组件方法报错“this.$refs.xxxx“,检查是否组件用了v-if,如果是改为v-show试试

在父类组件中 <template> <view> <MemberLogged ref"isLogged" toLogIn"gotoLogging" v-if"proposItem.active1"></MemberLogged> </view> </template> 子类组件中有 methods: { …

完美解决序微信小程序不能用本地ip调试的问题,不在以下 request 合法域名列表中,请参考文档:https://d

微信小程序不能用本地ip调试的问题&#xff0c;错误如下 不在以下 request 合法域名列表中&#xff0c;请参考文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html i 通过链接过去看到 只要通过对微信开发者工具进行以下设置即…

jquery添加click事件,jq动态添加click事件多种方式分享

目录&#xff1a; 添加方式 实例演示 添加方式 $("#ImId1").click(function(){}); $("#ImId2").bind("click",function(){}) $("#ImId3").on("click",function(){}) $("body").delegate("#xxx","c…

内网穿透,解决vue项目中的“Invalid Host header”

在webpack.dev.config.js&#xff0c;加入devServer: { disableHostCheck: true }&#xff0c;具体如下图 结果就能通过内网穿透了&#xff0c;访问结果

配置spring boot jpa控制台打印sql日志

在application.properties中加入以下两行 spring.jpa.properties.hibernate.format_sqltrue spring.jpa.properties.hibernate.show_sqltrue运行起来看到这样的结果

看完这篇能解决一些关于element ui table控件的使用常见问题,如table中自定义a标签,列中加入复选框或者序号列,时间控件的格式问题等

在script中加入 var app new Vue({el: #app,data: function () {return { itemList:[],}}, created: function() {//初始化你的table数据this.itemList你的list数据 }, methods: { submitForm: function (formName) {// }, resetForm: function (formName) {this.$refs[form…