java 跨域上传_跨域文件上传-程序员宅基地

技术标签: java 跨域上传  

文件上传的用处很大,比如上传头像什么的,都需要文件上传。

今天我刚写完文件上传,大大小小的各种bug,我也是很苦恼。但是还好终于都写完了。来博客分享一下。

最重要的就是Multiparfile 和 jesyf实现跨域!

需要的jar包:

文件上传:com.springsource.org.apache.commons.fileupload-1.2.0.jar

文件的读写:com.springsource.org.apache.commons.io-1.4.0.jar

由于是跨服务器上传,这里是通过jersey实现的:

jersey-client-1.18.jar

jersey-core-1.18.jar

在springmvc配置文件中,加上配置:

db.properties配置文件:修改url

url=jdbc\:mysql\:///mybatis?useUnicode=true&characterEncoding=utf8

去tomcat 修改jersey服务:

0ceb6e1b50ef712fa20b15ab6ca776aa.png

我们模拟创建一个图片服务器,在web下创建一个存放图片的地方(upload),然后更换端口号(别跟主工程一样就行)

接下来运行工程,自浏览器打开的网页别关。

fbd81d31f0a6fd056f58ff72f56171d6.png

然后我们在创建一个要获取文件的工程。这个工程必须是一个SSM。可以运行的。

创建一个list.jsp(显示查询出来的数据)

创建一个UpdateUser.jsp(修改界面)

44f369531f1c7c8e9d76483d2639885c.png

Mapper和Service层,自己写就可以了。就是简单的一个修改,和查询。

数据库的表可以按照我的PO类进行创建。也可以用自己的。(图片的字段设置null)!

这个是PO类。

public class Items {

private Integer id;

private String name;

private Float price;

private String pic;

private String createtime;

private String detail;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name == null ? null : name.trim();

}

public Float getPrice() {

return price;

}

public void setPrice(Float price) {

this.price = price;

}

public String getPic() {

return pic;

}

public void setPic(String pic) {

this.pic = pic == null ? null : pic.trim();

}

public String getCreatetime() {

return createtime;

}

public void setCreatetime(String createtime) {

this.createtime = createtime;

}

public String getDetail() {

return detail;

}

public void setDetail(String detail) {

this.detail = detail == null ? null : detail.trim();

}

@Override

public String toString() {

return "Items{" +

"id=" + id +

", name='" + name + '\'' +

", price=" + price +

", pic='" + pic + '\'' +

", createtime=" + createtime +

", detail='" + detail + '\'' +

'}';

}

}

MultipartHttpServletRequest 用于根据name名称获取多部件请求对象

CommonsMultipartFile 多部件请求对象,该对象可以获取到file文件对象信息,用于上传文件做准备

PrintWriter 对象可以将json对象回传给ajax

步骤:

1 设置方法三个参数

2 根据input的name名获取CommonsMultipartFile 对象

3 获取文件上传流

4 拼接文件名(毫秒时间+2个随机数)

5 获取源文件扩展名,后缀

6 创建上传服务器文件完整路径 Commons.PIC_HOST+"/upload/"+fileNameStr+suf

7 创建jesy服务器Clien对象,实现跨域上传

8 开始上传 resource.put(String.class,bytes);

9 拼接相对文件路径,用于存储到数据库中

10 将完整路径与相对路径拼接为json格式 String result="{\"fullPath\":\""+fullPath+"\",\"relativePath\":\""+relativePath+"\"}";

11 回传给ajax printWriter.print(result);

这个是我Controller层:

@RequestMapping(value = "uploadPic",method = RequestMethod.POST)

// MultipartHttpServletRequest 用于根据name名称获取多部件请求对象

public void uploadPic(MultipartHttpServletRequest request, String fileName, PrintWriter printWriter){

CommonsMultipartFile cmf = (CommonsMultipartFile) request.getFile(fileName);

// 获取文件上传流

byte[] bytes = cmf.getBytes();

String fileNameStr = "";

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

fileNameStr = sdf.format(new Date());

System.out.println("时间戳"+fileNameStr);

Random random = new Random();

for (int i = 0; i < 3; i++) {

fileNameStr +=random.nextInt(10);

}

// 获取文件扩展名

String originalFilename = cmf.getOriginalFilename();

String suf = originalFilename.substring(originalFilename.lastIndexOf("."));

System.out.println("获取文件扩展名"+suf);

// 创建jesyf服务器,实现跨域上传文件

Client client = new Client();

WebResource resource = client.resource(Commons.PIC_HOST+"/upload/"+fileNameStr+suf);

resource.put(String.class,bytes);

// 拼接图片完整路径

String fullPath = Commons.PIC_HOST+"/upload/"+fileNameStr+suf;

String relativePath = "/upload/"+fileNameStr+suf;

String result="{\"fullPath\":\""+fullPath+"\",\"relativePath\":\""+relativePath+"\"}";

System.out.println("完整路径"+result);

System.out.println("完美路径"+relativePath);

// 向页面输出一个json对象

printWriter.print(result);

}

这个页面是显示我查询出来数据的jsp页面。

pageEncoding="UTF-8"%>

--%>

--%>

--%>

欢迎使用list回显

配置公共路径:

再没上传图片之前,picPath是空的。(是为了在上传之后,你会发现数据库已经有了图片路径,到那时页面没显示,就需要这句话。)

编号 姓名 价格 详情 商品图片 日期
${items.id} ${items.name} ${items.price} ${items.detail}

${items.createtime}

修改

删除

ajax使用的是:

jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地、无侵入地升级HTML表单以支持Ajax。

jQuery Form有两个核心方法 – ajaxForm() 和 ajaxSubmit(), 它们集合了从控制表单元素到决定如何管理提交进程的功能

使用JQuery的$.ajax()会报错。

如果使用$.ajax()请求,则提交的Request类型最终为RequestFacade,而不是MultipartHttpRequest

ee0159f93084310e169f8c4abf38f54c.png

这个是我的修改界面:

pageEncoding="UTF-8"%>

Title

--%>

--%>

function submitImgSize1Upload(){

// alert('你是猪吗'); 验证是否走了点击事件

var option={

url:'${pageContext.request.contextPath }/upload/uploadPic.do',

type:'POST',

dataType:'text',

data:{

fileName : 'imgSize1File' 将选取的图片路径传到后台进行处理。

},

success:function(data){

alert(data);

//把json格式的字符串转换成json对象

var jsonObj = $.parseJSON(data);

// 通过input标签设置的ID,把图片路径fu gei

//返回服务器图片路径,把图片路径设置给img标签(显示修改页面的图片)

$("#imgSize1ImgSrc").attr("src",jsonObj.fullPath);

//数据库保存相对路径,在图片的input标签内加上Id,把imgSize1写到id内

//把路径传到后台,添加到数据库中。

$("#imgSize1").val(jsonObj.relativePath);

},

};

//拿到form表单对象,提交表单

$("#itemForm").ajaxSubmit(option);

}

这个属性是文件上传必须用到的

姓名:

价格 :

描述 :

商品图片: %24%7BpicPath%7D%24%7Bitems.pic%7D

图片路径:

日期 :

这个是Maven版本的需要导入的依赖:

1be11c3f776cb292b17625950549d94d.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39825322/article/details/114169058

智能推荐

关联数据库中多张表_关联数据-程序员宅基地

文章浏览阅读1k次。在本系列的前两篇文章(“ 使用RDF创建数据网 ”和“ 使用SPARQL查询RDF数据 ”)中,您了解了资源描述框架(RDF)以及SPARQL协议和RDF查询语言(SPARQL)—两个万维网联盟(W3C)标准,用于创建可移植的,可查询的,网络友好的数据。 通过RDF的图形模型,可以轻松地从各种来源收集有关主题的信息。 现在,您知道如何通过HTTP将RDF数据提取给您以进行本地查询,或将查询推送..._开放关联数据云图

Efficientnet网络详解及构建-程序员宅基地

文章浏览阅读5.7k次,点赞5次,收藏62次。1.EffificientNet的基线网络2.MBConv结构如图所示,1*1的卷积用于升维,将输入通道数变为filters_in * expand_ratio,Depwise Conv是深度可分离卷积,SE是Squeeze-and-Excitation模块,是Luong注意力机制在图像中的应用,下面1*1的卷积用于降维,将维度调整为filters_out,最后是Dropout层,减少过拟合。2.1 深度可分离卷积对于5x5x3的输入,如果想要得到3x3x4的f..._efficientnet

《计算机网络自顶向下方法》学习笔记(前六章)_对于tdm,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络-程序员宅基地

文章浏览阅读464次。回答这个问题可以从两方面入手,一个方面是它的具体构成(即构成因特网的基本硬件和软件组件;另一个方面是服务描述。协议(protocol)定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文发送和/或接收一条报文或其他事件所采取的动作。DNS的一种简单设计是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。单点故障。如果该DNS服务器崩溃,整个因特网随之瘫痪通信容量。单个DNS服务器不得不处理所有的DNS查询(用于为上亿台主机产生的所有HTTP请求报文和电子邮件报文服务)_对于tdm,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络

[计算机提升] 安装(重装)系统:微软官方ISO镜像文件直接写入_直接用镜像文件重装系统-程序员宅基地

文章浏览阅读1.8k次,点赞42次,收藏21次。微软官方ISO镜像的优点:①、纯净:微软官方系统仅保留系统最基本最重要的功能和组件,不会有其他镜像带有一些办公、辅助类软件,比如WPS、QQ、迅雷、微信、搜狗输入法等。虽然镜像带有这些办公、辅助类可以让用户更加容易快速上手电脑。但是还是有一定的隐患。比如,办公软件很久未更新,存在漏洞。锁定用户浏览器的主页,让你每次打开浏览器都默认打开某个不知名的网址。更有甚者,直接在镜像中植入木马,盗取用户信息。②、方便、简单_直接用镜像文件重装系统

刷题啦啦啦.._搬很荣题答案啦啦啦啦建个小时就。7474123680-程序员宅基地

文章浏览阅读1.3k次。50/50 完成啦完成啦!!!!_搬很荣题答案啦啦啦啦建个小时就。7474123680

k8s1.16.3+Traefik 2.0.5部署亲测,阿里云和腾讯云(二)_traefik rbac namespace-程序员宅基地

文章浏览阅读1k次。一、Traefik 简介Traefik 最新推出了 v2.0 版本,这里将尝试升级到最新,简单的介绍了下如何在 Kubernetes 环境下安装 Traefik v2.0,在 Traefik v2.0 版本后,配置 Ingress 路由规则其使用了自定义 CRD 对象来完成,并不像之前 1.0+ 版本使用 Kubernetes 自带的 Ingress 对象加注解方式来完成路由配置,下面将介绍如何在 Kubernetes 环境下部署并配置 Traefik v2.0。二、Kubernetes 部署 Tr_traefik rbac namespace

随便推点

PHP对接百度智能云之语言处理技术_php对接ai智能语言-程序员宅基地

文章浏览阅读463次。api地址https://cloud.baidu.com/doc/NLP/s/7k6z52ggx控制台申请应用https://console.bce.baidu.com/ai/?_=1619424019362&fromai=1#/ai/nlp/app/detail~appId=24317713、SDK下载控制器方法: /* * 百度AI智能 文章自动打标签 * 2021-4-26 16:45:06 */ publi._php对接ai智能语言

hdu 1087 Super Jumping! Jumping! Jumping!(DP)-程序员宅基地

文章浏览阅读498次。Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25057 Accepted Submission(s): 11073Problem De

聊天气泡框模块源码 (高仿微信、QQ聊天的气泡聊天框)_邓学彬(泪闯天涯) 气泡聊天框-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏6次。高仿微信、QQ聊天的气泡聊天框。基于列表框(ListBox)控件,自己计算每个项目位置,自绘项目内容。易语言模块+模块源码+调用例程。_邓学彬(泪闯天涯) 气泡聊天框

firebase创建数据库_使用Firebase和INSPhotoGallery在Swift中创建照片库-程序员宅基地

文章浏览阅读127次。firebase创建数据库 我目前正在开发一个名为i-Travel Journal的旅行应用程序 ,而我想添加的功能之一是允许用户上载和删除图库中的照片的功能。 我正在互联网上搜索一篇博客文章,该文章不仅在后端使用了Firebase,而且还使用了很棒的INSPhotoGallery Pods Framework完成了工作,但令我沮丧的是,我找不到能显示所有复杂细节的文章。 因此,为了帮助我的编码...

嵌入式学习(三)—调试工具J_Link介绍_jlink-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏60次。J-Link介绍J-Link是segger公司的产品,J-Link的官方提供调试软件和驱动,功能比较强大,看一下百度百科的介绍:J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实_jlink

交叉连接和内链接_交叉链接,重新发布和媒体权利的黑白两色-程序员宅基地

文章浏览阅读127次。交叉连接和内链接Over the past few days, the WPBeginner team has been in New York City at Blog World Expo East. While here we have the pleasure of being able to share interesting sessions with you like this pa..._link to record of consent

推荐文章

热门文章

相关标签