热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

纯js实现跨域上传文件

最近在做一个项目,包含几个独立的子项目,都用到了图片上传的功能,因此把要把图片处理部分独立出来。因为子项目有的使用java,也有使用.net开发的,所以考虑到兼

      最近在做一个项目,包含几个独立的子项目,都用到了图片上传的功能,因此把要把图片处理部分独立出来。

      因为子项目有的使用java,也有使用.net开发的,所以考虑到兼容性,直接采用js客户端来实现。而每个项目使用独立的一个端口,所以采用iframe方式解决js的跨域问题。
      原理:

     客户端打开一个模式窗口win1,win1通过iframe嵌套文件服务器上的上传页面。文件服务器在完成上传过重定向win1页面到客户端的另一个窗口win2,并带上上传后的文件实际访问路径参数,win2完成从url地址上获取文件地址,返回该地址并关闭模式窗口。

 

      实现:

     图片的上传服务器采用ssh框架,在图片服务器上建立一个图片上传页面供客户端嵌套,upload.html页面代码如下:


 
   

   
   
   
 
 
 http://${basePath}/fileService/uploadFile/uploadFileForOthers.action" method="post" enctype="multipart/form-data">
   
   
   
   
   

   
   
 

以上form的action地址为文件上传的实际地址,upload为上传的文件名,returnUrl为win2地址,其他两个可忽略,项目中用于上传图片的分类和安全机制。

图片上传action:uploadFileForOthers.class

 

public String uploadFileForOthers()
    {
        String pix = "?";
        if(returnUrl.indexOf("?")>0)
        {
            pix = "&";
        }
        //验证验证码
        String key = RSA.Dec_RSA(securityKey);
        if(System.currentTimeMillis() -(new Long(key)).longValue()>600000)
        {
            LOG.error("--------------------------------------------验证码不正确--------------------------------------------------");
            String script = "";
            PrintWriter out;
            try
            {
                out = ServletActionContext.getResponse().getWriter();
                out.println(script);
                out.flush();  
                out.close();
            }
            catch (IOException e)
            {
                LOG.error("--------------------------------------------提示用户出错--------------------------------------------------");
            }
             
        }
       
       
       
        LOG.error("-----------------开始保存"+typeFlag+"来源的文件---------------uploadFileName:"+uploadFileName+"---------------");


        try
        {
           
            if(uploadFileName!=null&&!uploadFileName.trim().equals("")&&fileUpload!=null)
            {
                String newFileName = fileUpload.createFileName();
                LOG.error("-------------------------------------------newFileName:"+newFileName+"------------------------------------");
                String projectPath =ServletActionContext.getServletContext().getRealPath("/"); 
                String url = fileUpload.uploadFile(upload, uploadFileName, typeFlag, newFileName,projectPath);
                String script = "";

//本句为关键,经测试ie6-ie8,火狐等都可成功。(原来采用parent.location来重定向时ie6-ie7可成功,火狐和ie8无法成功)
                PrintWriter out = ServletActionContext.getResponse().getWriter();
                out.println(script);
                out.flush();  
                out.close(); 
                LOG.error("--------------------------------------------保存成功--------------------------------------------------");
            }
        }
        catch (Exception e)
        {
            LOG.error(e.getMessage());
            String script = "";
            PrintWriter out;
            try
            {
                out = ServletActionContext.getResponse().getWriter();
                out.println(script);
                out.flush();  
                out.close();
            }
            catch (IOException e1)
            {
               
            }
        }
        LOG.error("--------------------------------------------结束--------------------------------------------------");
        return null;
    }

 

 

 

客户端:win1.html

 

 

客户端:win2.jsp

  <%
     String errorMsg = request.getParameter("errorMsg");
     if(errorMsg != null && errorMsg.trim().length()>0){
     %>
      
     <%}else{
    String url = request.getParameter("filename");
    if(url!=null && url.trim().length()>0){
    %>
    
    <%
    }else{
    
    }
   }
   %>

 

调用js

function openwin(){
    var url="win1.htm?rid=${rid}";
    var returnData=window.showModalDialog(url,window,"status:no;dialogWidth:200px;dialogHeight:150px;scroll:no;")
    if(returnData != undefined){
     dd(returnData);
    }
    //WO_LS( url, 400,200);
   }


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
author-avatar
茶不离
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有