multipart/form-data多文件上传

curl第十课 multipart/formdata表单上传 基础multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。场景Http服务器定义了上传数据的格式,接口地址 http://10.10.10.10:80/restful/personInfo,参... 阅读详情

1.html

anction为后端路径 
enctype="multipart/form-data"为文件提交类型

 <form action="/AppStore/file/upload" name="myForm" id="fileForm"  enctype="multipart/form-data" method="post" class="form-horizontal">
                <!-- START panel-->
                <div class="panel panel-default">

                    <input type="text" name="id" value="{{id}}" hidden>
                    <div class="panel-heading">
                        <div class="panel-title">上传文件</div>
                    </div>
                    <div class="panel-body">
                        <fieldset>
                            <div class="form-group">
                                <label class="col-sm-2 control-label">安卓安装包</label>
                                <div class="col-sm-6">
                                    <input type="file" accept=".apk" name="apkFile" required="required" />
                                </div>
                            </div>

                            <div class="form-group">
                                <label class="col-sm-2 control-label">苹果安装包</label>
                                <div class="col-sm-6">
                                    <input type="file" accept=".ipa" name="ipaFile" required="required" />
                                </div>
                            </div>
                        </fieldset>
                        <fieldset>
                            <div class="form-group">
                                <label class="col-sm-2 control-label">上传图标</label>
                                <div class="col-sm-6">
                                    <input type="file" accept=".png" name="appIcon" required="required"/>
                                </div>
                            </div>
                        </fieldset>
                        <fieldset>
                            <div class="row">
                                <label class="col-sm-2 control-label">上传图片</label>

                                <div style="margin-left:300px;margin-top:20px">
                                    演示图片1
                                    <input type="file" accept=".png" name="appShow" required="required"/><br/>
                                </div>
                                <div style="margin-left:300px;margin-top:20px">
                                    演示图片2
                                    <input type="file" accept=".png" name="appShow"   required="required"/><br/>
                                </div>
                                <div style="margin-left:300px;margin-top:20px">
                                    演示图片3
                                    <input type="file" accept=".png" name="appShow" required="required"/><br/>
                                </div>
                                <div style="margin-left:300px;margin-top:20px">
                                    演示图片4
                                    <input type="file" accept=".png" name="appShow"  required="required"/><br/>
                                </div>
                            </div>
                        </fieldset>
                    </div>
                    <div class="panel-footer text-center">
                        <button type="button" class="btn btn-info" ng-click="saveReport()"  ng-disabled="myForm.$invalid">确认</button>
                    </div>

                </div>
                <!-- END panel-->
            </form>

2.springmvc后端

multipartResolver 根据文件名解析获取文件

@RequestMapping(value="/upload", method=RequestMethod.POST	)
	@ResponseBody
	public Map<String, Object> upload(HttpServletRequest request,HttpServletResponse response){
		Map<String, Object> resMap = new HashMap<String, Object>();
//		获取appId
		int id = Integer.parseInt(request.getParameter("id"));
		resMap.put("id", id);
		String rootPath=UploadFileController.class.getResource("/").getFile();
		rootPath = rootPath.substring(1, rootPath.length()-8);
		String apkPath=rootPath+"file"+"/apk/";
		String ipaPath=rootPath+"file"+"/ipa/";
		String appIconPath=rootPath+"img"+"/AppIcon"+"/";
		String appShowPath=rootPath+"img"+"/AppShow"+"/"+id+"/";
		try {


		//创建一个通用的多部分解析器
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		//判断 request 是否有文件上传,即多部分请求
		System.out.println("1");
		if(multipartResolver.isMultipart(request)){
			System.out.println("2");
			//转换成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
			MultipartFile apkFile=multiRequest.getFile("apkFile");
			MultipartFile ipaFile=multiRequest.getFile("ipaFile");
			MultipartFile appIconFile=multiRequest.getFile("appIcon");
			List<MultipartFile> appShowFiles=multiRequest.getFiles("appShow");

			UploadMultipartFile.saveOneFile(apkFile, apkPath, id);
			UploadMultipartFile.saveOneFile(ipaFile, ipaPath, id);
			UploadMultipartFile.saveOneFile(appIconFile, appIconPath, id);
			UploadMultipartFile.saveListFile(appShowFiles, appShowPath, id);

			Map<String, String> checkMap=fileService.checkFile(id);
			 for (Object o : checkMap.keySet()) {
				 System.out.println("key=" + o + " value=" + checkMap.get(o));
				 if (checkMap.get(o).equals("false")) {
					 resMap.put("result", "error");
					break;
				}else {
					resMap.put("result", "success");
				}
				  }
		}else {
			resMap.put("result", "error");
		}} catch (Exception e) {
			resMap.put("result", "error");
			return resMap;
		}
		return resMap;
	}

3.UploadMultipartFile

将MultipartFile保存为本地文件

package com.baosight.webapp.util;
import java.io.File;
import java.io.IOException;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.baosight.webapp.web.UploadFileController;

public class UploadMultipartFile {
	public static void saveOneFile(MultipartFile file,String path,int id){
		try {


		System.out.println("empty");
		if (!file.isEmpty()) {
			System.out.println("not empty");
			System.out.println("file:"+file.getOriginalFilename());
			String OriginalNameArr[]=file.getOriginalFilename().split("[.]");
			String fileName = id+"."+OriginalNameArr[OriginalNameArr.length-1];
			path=path+fileName;
			System.out.println("path:"+path);
			File localFile = new File(path);
			try {
				if(!localFile.getParentFile().exists()) {
					 //如果目标文件所在的目录不存在,则创建父目录
					 localFile.getParentFile().mkdirs();
					 System.out.println("parent:"+localFile.getParentFile().getPath());
				 }
				file.transferTo(localFile);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		} catch (Exception e) {
			System.out.println("exce[tion2");
			System.out.println(e.getMessage());
		}
	}

	public static void saveListFile(List<MultipartFile> files,String path,int id){
		try {

		String path2="";
		if(files!=null&&files.size()>0){
			int j=0;
			for (MultipartFile multipartFile : files) {
				if (!multipartFile.isEmpty()) {


				 j++;
				 String OriginalNameArr[]=multipartFile.getOriginalFilename().split("[.]");
				 path2=path+j+"."+OriginalNameArr[OriginalNameArr.length-1];
				 File localFile = new File(path2);
				 if(!localFile.getParentFile().exists()) {
					 //如果目标文件所在的目录不存在,则创建父目录
					 localFile.getParentFile().mkdirs();
					 System.out.println("parent:"+localFile.getParentFile().getPath());
				 }
			try {
				multipartFile.transferTo(localFile);
			} catch( Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				}
		}
		}} catch (Exception e) {
			System.out.println("exception1");
			// TODO: handle exception
		}
	}



}
4.阻止表单提交后的跳转动作
引入jquery.js和jquery-form.js文件
本文这里基于angularjs+html5开发,有angularjs多文件上传有问题后,使用form表单上传文件,为了有回调信息使用jquery-form.js阻止表单跳转
按钮触发的事件:ng-click="saveReport()"
 $scope.saveReport=function saveReport() {
        $scope.showFile=false;
        $scope.showProgress=true;
        // jquery 表单提交
        $("#fileForm").ajaxSubmit(function(message) {
            console.log( message);

            if(message.result=="success"){
                alert("上传成功");

                $state.go("dash",null,{reload:true});
            }else{
                alert("上传失败,请在更新中重新上传");
                $state.go("dash");
            }
           
        });

        return false; // 必须返回false,阻止页面跳转
    }


C++解析multipart/form-data 背景 使用boost.beast实现简单的HTTP服务,但是boost.beast没有提供对表单数据的解析,为此需要自己实现解析表单数据。 application/x-www-form-urlencoded的格式与URL的查询字符串格式一样,只是会被URL编码,比较容易处理 但multipart/form-data相对而言比较复杂 multipart/form-data multipart/form-data主要是为了解决application/x-www-form-urlencoded编码格式在传输大量二 阅读详情

相关推荐

SpringBoot2.1.x,okhttp3网络请求之MultipartFile方式上传文件,multipart/form-data表单多文件+多参数

一)引入okhttp3的jar <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.0.0</version> </dependency> 二)提供一个上传服务接口,文件类型为MultipartFile package com.oyse.

p812438109的专栏 7495

使用multipart/form-data方式传文件+参数

const obj = { hello: "world" }; const json = JSON.stringify(obj); const blob = new Blob([json], { type: 'application/json' }); const data = new FormData(); data.append("document", blob); axios({ method: 'post', url: '/sample', data: data, })

c1824338832的博客 7505

用C语言编写multipart/form-data实现上传文件

用C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。

【JAVA】前端multipart/form-data传文件及参数,后端拿值问题

1. 首先multipart/form-data,必须要使用post方式才可以请求到;2. 其次后台需要配置&lt;bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"&gt; &lt;property name...

邪神大人 3万+

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7069

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

qq_38120851的博客 4046

多文件上传multipart/form-data

前言 在web开发中上传文件比较简单,一个普通的post表单再加上文件类型的标签就可以完成,上传的这些工作都是交给浏览器完成。但是在客户端上传文件时就需要自己写http上传相关的参数。 多文件上传 请求头 ...... Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMHzissskK7K82uyt 多文件上传...

沐上云霄的博客 4048

通信工程学习:什么是OLT光线路终端

OLT(光线路终端)是无源光网络(PON)的核心局端设备,负责光/电信号转换、数据处理、带宽分配及用户管理。具有高带宽、低损耗、高安全性和易维护等技术特点,广泛应用于家庭、企业及公共机构宽带接入。未来将向更高性能、智能化方向发展,结合SDN/NFV等新技术,提升网络服务质量。

limengshi138392的博客 4359

小程序实现真正多文件上传(multipart/form-data)

简介 小程序官方提供的api wx.uploadFile一次只能上传一个文件,一般的解决方案是调用多次,但是存在最大并发限制10,wx-multipart实现了一般的content-type 为 multipart/form-data的post请求。 原理 对于post请求,小程序官方提供了wx.request和wx.uploadFile。但是wx.uploadFile一次只能上传一个文件,那可不...

weixin_34292287的博客 7363

避坑指南:解决‘Logical volume contains a filesystem in use’错误,顺利完成LVM根目录扩容

本文详细解析了Linux系统中LVM根目录扩容时遇到的‘Logical volume contains a filesystem in use’错误,提供了从错误诊断到实战解决方案的完整指南。通过动态扩容技术、单用户模式操作和LVM快照等方案,帮助管理员顺利完成根目录扩容,避免数据丢失和系统崩溃。

weixin_28702105的博客 227

教程 | VeriStand硬件在环仿真测试第一章

这篇是系列文章的第一章,满满的都是干货,感兴趣的话欢迎一起交流探讨。

HUASUITECH的博客 1万+

Netcore webapi + 后端多文件多参数 multipart/form-data 上传

这次是因为项目上需要用到多文件上传功能,需求是有一个winfrom程序要上传多个文件给netcore webapi 并且上传接口要能够支持多个参数的传递方式; 期间也遇到了很多问题,随手记录一下,方便自己也也方便他人; 首先第一步要搞清楚什么是 multipart/form-data 格式上传 ; 这里我写了个表单,然后用抓包工具来抓取协议; 表单提交页面如下: 抓包的请求头信息 Content-Type: multipart/form-data; boundary=----WebKitFormBoun..

做梦都在写代码 7326

某银行大数据分析平台之云原生架构

软考架构师论文

doudoudouy的博客 768

使用HttpClient4.5 post提交multipart/form-data数据实现多文件上传

使用HttpClient4.5 post提交multipart/form-data数据实现多文件上传 场景:前端提交multipart/form-data数据,由api服务A将请求转发到api服务B。 maven依赖 &lt;dependency&gt; &lt;groupId&gt;commons-httpclient&lt;/groupId&gt; &lt;art...

Alex Li的专栏 2万+

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

华为自研 ERP、Oracle EBS 与 SAP 上线时系统配置思路设计差异深度分析

本文对比分析了华为自研ERP、Oracle EBS和SAP S/4HANA三大ERP系统在上线配置思路上的核心差异。从架构设计看,华为采用分布式微服务架构,SAP采用分层服务架构,Oracle采用集中式一体化架构;在模块配置上,华为以业务场景为导向,SAP基于行业模板,Oracle强调模块独立性;数据迁移方面,华为侧重业务规则清洗,SAP注重数据质量监控,Oracle依赖标准化工具;流程适配上,华为系统随流程调整,SAP在框架内优化,Oracle需定制开发;定制开发模式差异明显,华为采用插件化扩展,SAP使

金牌架构师 1454

服务器接收大文件fromdata,多文件上传multipart/form-data

多文件上传multipart/form-data前言在web开发中上传文件比较简单,一个普通的post表单再加上文件类型的标签就可以完成,上传的这些工作都是交给浏览器完成。但是在客户端上传文件时就需要自己写http上传相关的参数。多文件上传请求头......Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMHzis...

weixin_32955881的博客 1079

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WebApi实现Ajax模拟Multipart/form-data方式多文件上传

前端页面代码: <input type="file" class="file_control" /><br /> <input type="file" class="file_control" /><br /> <input type="file" class="file_control" /> <button...

diliaolu1763的博客 671

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

webapi实现AJAX多文件上传,WebApi实现Ajax模拟Multipart/form-data方式多文件上传

前端页面代码:上传$(document).ready(function () {$("#btnUpload").click(function () {var formdata = new FormData();var files = $(".file_control");$.each(files, function (index, domEle) {formdata.append("file" +...

weixin_42325867的博客 532

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

node:express解析multipart/form-data数据;上传文件(单文件+多文件)

文件上传的时候,我们会采用multipart/form-data的请求体格式,而express.urlencoded()中间件并不能去解析此格式的数据,因此我们需要去找一个可以解析multipart/form-data格式的包,这里推荐使用multer,npm地址。...

本以为成功很简单,没想到活成普通人都需拼尽全力! 3760

http post 使用multipart/form-data 格式数据 上传文件(图片)

由于工作上的需求,这两天对接了个php的接口,上传文件必须使用固定格式,下面看下需要上传的格式,从图片中可以看出,多个图片数据是使用boundary分割的,并且在每个数据体内(即从分割符到下一个分割符),除了name以外,还必须拼接特定字段,例如pictype isurl等等,这个比较重要,因为使用RestTemplate 和hettpClient方式,无法拼接该字符(本人确实第一次写,如果哪位大神可以用这两种方式写出来,希望能够留言,交流学习) 下面来说下如何解决该类问题的 首先在使用httpcl.

Jameslvt的博客 5073

实现使用HTTP协议发送multipart/form-data类型的HTTP表单

     .Net FrameWork对HTTP协议做了很好的封装,使我们使用HTTP协议的时候变的非常简单,但是.Net只能使用application/x-www-form-urlencoded方式来POST数据,使用System.Net.WebClient上传递文件(multipart/form-data方式)只能上传单个,而我们在实际中文件和表单混合提交、多文件上传的需求也很多,这些都是目前

Qqwwee_Com 1万+

如何用SpringBoot框架来接收multipart/form-data文件

今天遇到一个坑,这里给大家介绍一下。 想学习分布式、微服务、JVM、多线程、架构、java、python的童鞋,千万不要扫码,否则后果自负~ 现在很多文件上传类型都是multipart/form-data类型的,HTTP请求如下所示: 可是问题就在于如果用传统的Struts2或者servlet等都可以很容易的实现文件接收的功能,例如下面的代码就可以实现: boolea...

林老师带你学编程 11万+

multpart多文件上传总结

在最初的http协议中,没有定义上传文件的Method,为了实现这个功能,http协议组改造了post请求,添加了一种post规范,设定这种规范的Content-Type为multipart/form-data;Retrofit其实是个网络代理框架,负责封装请求,然后把请求分发给http协议具体实现者httpclient,retrofit默认的httpclient是okhttp。...............

weixin_41480546的博客 3760

基于HTTP的多文件上传问题

Http

Vince的修炼之路 4901
上一篇: oracle数据库插入二进制文件
下一篇: java写文件中并发和乱码问题解决
programmeryu
博客等级 码龄11年 23粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值