java实现多文件上传至本地服务器

转载自  java实现多文件上传至本地服务器

博主最近在做一个内网项目,内部可以访问外部数据,但是外部访问不了内部数据,这也就造成了可能文件无法上传,所以博主另辟蹊径,在本地服务器上建立一个文件夹专门用来存储上传数据。
环境:jdk,tomcat

一、前台上传文件(ajax上传)

 <input type="file" name="annexUrl" id="annexUrl" multiple="multiple"/>

其中multiple=“multiple”,设置文件多上传

 function uploadFile() {var files = document.getElementById("annexUrl").files;if (files.length != 0) {var formData = new FormData();for (var i = 0; i < files.length; i++) {var file = files[i];formData.append(file.name, file);}$.ajax({url: 'cdc/public/saveFiles',type: 'POST',cache: false,data: formData,//这个参数是jquery特有的,不进行序列化,因为我们不是json格式的字符串,而是要传文件processData: false,//注意这里一定要设置contentType:false,不然会默认为传的是字符串,这样文件就传不过去了contentType: false,success: function (data) {save(data.data);}});} else {save();}}

这里需要使用到formData对象用来封装file文件对象,save()方法是用来保存上传之后返回过来的文件路径,保存到数据库,便于下载。

 

二、后台接收文件,并上传至服务器

//    多文件上传,返回一个对象集合(附件地址,名称)@RequestMapping(value = "saveFiles", method = RequestMethod.POST)@ResponseBodypublic JSONObject saveFiles(HttpServletRequest request, HttpServletResponse response) {JSONObject jsonObject = new JSONObject();try {request.setCharacterEncoding("UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}Collection<Part> parts = null;try {parts = request.getParts();} catch (IOException e) {e.printStackTrace();} catch (ServletException e) {e.printStackTrace();}Iterator<Part> iterator = parts.iterator();
//      名称集合,返回给前台List<String> list = new ArrayList<>();while (iterator.hasNext()) {Part part = iterator.next();// 生成实际存储的真实文件名(唯一)
//            不知道为什么,文件上传必须得包含获取到的文件名,否则报文件名、目录名或卷标语法不正确,图片上传没有这种限制
//            文件名,保存导数据库,用来界面显示String name = part.getName();String realName = UUID.randomUUID().toString() + name;list.add(name + "&&" + realName);///home/tomcat/apache-tomcat-9.0.1/filesString realPath = "D:" + File.separator + "apache-tomcat-8.5.15" + File.separator + "files";// String realPath = "C:" + File.separator + "XHJ224" + File.separator + "software" + File.separator + "apache-tomcat-9.0.1" + File.separator + "files";
//             String realPath = File.separator + "home" + File.separator + "tomcat" + File.separator + "apache-tomcat-9.0.1" + File.separator + "files";File file = new File(realPath);//如果目录不存在if (!file.isDirectory()) {//创建文件上传目录file.mkdirs();}// 文件存放的真实路径String filePath = realPath + File.separator + realName;try {part.write(filePath);} catch (IOException e) {e.printStackTrace();}}jsonObject.put("data", list);return jsonObject;}

其中list集合添加了一个由文件名和真实文件名拼接的字符串,后期save需要。realName是为了防止多上传文件名冲突,realPath是文件保存路径,不同的操作系统有不同的路径,realPath最好放在tomcat下,便于项目移植。

其中File.separator为路径分隔符,他能自动识别是哪个操作系统而使用不同的路径分隔符(windows是‘\’,linux是‘/’)。最后将list返回给前台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置struts.xml时extends=struts-default会报错,原因和解决

提示&#xff1a;此种解决方法只适用于Intellij IDEA&#xff0c;MyEclipse或者Eclipse还得另寻它法&#xff0c;但估计原因应该是类似的。 在Intellij IDEA 2017使用Struts2框架时&#xff0c;若新建项目时并未导入Struts2框架而是在后期手动新建lib目录导入Struts2框架后&…

React生命周期(新)

三个标红的需要前面加上UNSAFE_ 三个常用的组件

《坚毅》的读后感

1.你的梦想是什么&#xff1f;有了梦想&#xff0c;那么接下来呢&#xff1f; 2.有什么问题&#xff1f; 3.你每天醒来后想阿着的是什么&#xff1f; 4.为什么现在是正确的时机&#xff1f; 5.你曾经做过的最艰难的事情是什么&#xff1f; 6.谁希望你成功&#xff1f; 7.你最重…

发力企业级市场,微软Hololens开辟了一条VR新道路

近日微软Hololens可谓是动作频频&#xff0c;2月份Hololens与BGC Engineering合作&#xff0c;从矿山规划到泥石流建模&#xff0c;该应用程序可帮助BGC Engineering及其客户可视化一个场景并解决工程问题。 3月份HoloLens与Cigna展开医疗合作&#xff0c;将Hololens用于健康检…

写给工程师的10条精进原则

转载自 写给工程师的10条精进原则 引言 时间回到8年前&#xff0c;我人生中的第一份实习工作&#xff0c;是在某互联网公司的无线搜索部做一个C工程师。当时的我可谓意气风发&#xff0c;想要大干一场&#xff0c;结果第一次上线就写了人生中第一个CaseStudy。由于对部署环境…

Struts2下创建自定义类型转换器(表单中日期的处理)

在表单提交中需要有日期的输入&#xff0c;默认的Struts2处理机制可能不能满足需求&#xff0c;需要自定义一下类型转换器。如&#xff1a; String----->java.util.Date&#xff1a;输入 java.util.Date------>String:输出&#xff1a;查询显示&#xff0c;输出错误回显 …

部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

一.CI&#xff08;Continuous Integration&#xff09;简介 CI规则1&#xff1a;尽量频繁地把代码签入到分支中以进行集成 CI规则2&#xff1a;不光要对语法进行验&#xff0c;也要提供一系列的自动化来验证 CI规则3&#xff1a;CI失败后&#xff0c;要把修复CI当做第一优先级的…

使用ListView控件展示数据

一、使用ListView实现大图标小图标的功能&#xff1a; 1.拖一个ListView控件 2.拖两个imageList控件&#xff0c;并且重命名为imgBig和imgSmall,分别设置两个控件的图片和大小。 3.编辑ListView的Items&#xff0c;添加几项&#xff08;C、D、E盘&#xff09; 4.通过ListView绑…

React中的唯一标识key(用index VS id)和key的选择

1. 虚拟DOM中key的作用&#xff1a;1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。2). 详细的说: 当状态中的数据发生变化时&#xff0c;react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较&#x…

Android中ImageView的scaleType 属性说明。

ImageView是Android中最常用的控件之一&#xff0c;在使用ImageView的时候&#xff0c;必不可少的会使用到scaleType属性&#xff0c;该属性指定了你的ImageView如何显示图片。包括是否进行缩放&#xff0c;等比缩放&#xff0c;缩放后显示的位置&#xff0c; Android中提供了八…

支付渠道参数如何设计成路由化配置

转载自 支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题&#xff1a;渠道参数路由化配置如何设计&#xff1f; 在开发支付系统的时候&#xff0c;我们经常会涉及到对接多个支付渠道&#xff0c;除常见的支付宝、微信外可能还会根据不同的…

实现Windows程序的数据更新

一、枚举&#xff1a; 1.语法&#xff1a;public enum 名字{ 值1,值2} 2.eg:public enum Genders{Male,FeMale} 3.使用枚举&#xff1a;枚举名.值 4.枚举的好处&#xff1a; (1)使代码更易于维护 (2)更易于用户输入值&#xff0c;直接用.的方式就可以获取值 (3)使代码更清晰&a…

分布式数据访问服务之1—华山论剑篇

业界主流的互联网架构中&#xff0c;分布式服务框架、分布式数据访问服务、消息队列服务、服务网关(API)、分布式事务等都是核心的组件和框架。 当我们的系统规模越来越大&#xff0c;从几台服务器扩展到几十台、几百台、上千台&#xff0c;传统的烟囱式的、大集中式系统架构&…

Android中异步任务AsyncTask的使用

1、当程序启动的时候&#xff0c;Android同时会启动一个对应的线程&#xff0c;【主线程、UI线程】主要负责处理与UI相关的线程 2、UI线程不允许访问网络进行耗时操作 3、子线程不允许更新UI。 由于Android中主线程不能访问网络、子线程不能更新UI&#xff0c;需要线程间通讯 完…

漫画:什么是快速排序?(完整版)

转载自 漫画&#xff1a;什么是快速排序&#xff1f;&#xff08;完整版&#xff09; 同冒泡排序一样&#xff0c;快速排序也属于交换排序&#xff0c;通过元素之间的比较和交换位置来达到排序的目的。 不同的是&#xff0c;冒泡排序在每一轮只把一个元素冒泡到数列的一端&a…

测试——《微服务设计》读书笔记

一.测试象限&#xff08;Brain Marick&#xff09; 二.测试金字塔&#xff08;Mike Cohn&#xff09; 1.单元测试 通常只测试一个函数或方法调用&#xff0c;通过TDD或者基于属性而写的测试就属于这一类&#xff0c;在UnitTest中&#xff0c;我们不会启动服务&#xff0c;对且对…

React功能界面的组件化编码流程

功能界面的组件化编码流程&#xff08;通用&#xff09; 1.拆分组件: 拆分界面,抽取组件 2.实现静态组件: 使用组件实现静态页面效果 3.实现动态组件 3.1 动态显示初始化数据 3.1.1 数据类型 3.1.2 数据名称 3.1.2 保存在哪个组件? 3.2 交互(从绑定事件监听开始)

Java 多文件上传

转载自 Java 多文件上传 前台代码很简单&#xff1a; <input type"file" accept".zip" class"file-load" multiple"multiple" name"files"/> 后台代码&#xff1a; public boolean uploadFlow(RequestParam Mult…