1.android客户端+springMVC服务端:服务端采用org.springframework.web.multipart.MultipartHttpServletRequest作为批量上传接收类
说明:MultipartHttpServletRequest对象是封装了servlet的,可以处理ios端使用AFNetworking封装文件流对象multipartFiles;封装的multipartparameters为请求参数。
public void sendBroadcast(HttpServletRequest request, HttpServletResponse response) throws Exception {
//在springMVC的框架下,在方法中处理客户端传过来的文件流及参数
//文件件的接收方式如下:
MultipartHttpServletRequest mureq = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> files = mureq.getFileMap();
for (String key : files.keySet()) {
MultipartFile file = files.get(key);
InputStream inS = file.getInputStream();
Map<String, String> map = FileUpload.getInstance().uploadImgVideoFile(inS, DBConstant.FILE_SUFFIX);
}
//获取到文件流之后,可以通过第三方上传插件进行文件上传,或者使用jdk自带的方法处理文件流
//ios封装的参数,服务端可以使用request.getParameterMap()获取
}
2.android客户端+strutsMVC服务端:这种搭配下的多文件上传(后期单独说明)
3.android客户端+servlet服务端(继承自httpServlet):这种搭配下的多文件上传
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(40960); // 设置缓冲区大小,这里是40kb
factory.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:字节
ServletFileUpload upload = new ServletFileUpload(factory);// 通过工厂生成一个处理文件上传的servlet对象
upload.setSizeMax(1 * 1024 * 1024 * 1024 * 10);// 一共最多能上传10G
List<FileItem> list = upload.parseRequest(request);
for (FileItem fileItem : list)
{
if (fileItem.getName() != null)
{
System.out.println("--------------"+fileItem.getInputStream());
Map<String, String> result = FileUpload.getInstance()
.uploadOrinImg(fileItem.getInputStream());
Map<String, String> result2 = FileUpload.getInstance()
.uploadThumbImg(fileItem.getInputStream());
if (result.containsKey("group_name")
&& result.containsKey("remote_filename")
&& result2.containsKey("group_name")
&& result2.containsKey("remote_filename"))
{
String ur1 = "/" + result.get("group_name")
+ "/" + result.get("remote_filename");
String ur2 = "/" + result2.get("group_name")
+ "/" + result2.get("remote_filename");
}
}
}
可以访问httpservlet的链接,需要在web.xml中配置如下:
<servlet>
<servlet-name>fileUploadImage</servlet-name>
<servlet-class>com.FileUploadImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUploadImage</servlet-name>
<url-pattern>fileUploadImage.action</url-pattern>
</servlet-mapping>
或者:使用原始的方式获取客户羰传过来的流文件 encodeImgVideo:表示接收的客户端的流文件
BASE64Decoder decoder = new BASE64Decoder();
// Base64解码
byte[] b = decoder.decodeBuffer(encodeImgVideo);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
// 调整异常数据
b[i] += 256;
}
}
InputStream input = new ByteArrayInputStream(b);
andriod端代码转载网上,谢谢分享,如下:
public
class
SocketHttpRequester
{
/**
*多文件上传
* 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
* <FORM METHOD=POST ACTION="http://192.168.1.101:8083/upload/servlet/UploadServlet" enctype="multipart/form-data">
<INPUT TYPE="text" NAME="name">
<INPUT TYPE="text" NAME="id">
<input type="file" name="imagefile"/>
<input type="file" name="zip"/>
</FORM>
* @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.iteye.cn或http://192.168.1.101:8083这样的路径测试)
* @param params 请求参数 key为参数名,value为参数值
* @param file 上传文件
*/
public
static
boolean
post
(
String
path
,
Map
<
String
,
String
>
params
,
FormFile
[]
files
)
throws
Exception
{
final
String
BOUNDARY
=
"---------------------------7da2137580612"
;
//数据分隔线
final
String
endline
=
"--"
+
BOUNDARY
+
"--\r\n"
;
//数据结束标志
int
fileDataLength
=
0
;
for
(
FormFile
uploadFile
:
files
){
//得到文件类型数据的总长度
StringBuilder
fileExplain
=
new
StringBuilder
();
fileExplain
.
append
(
"--"
);
fileExplain
.
append
(
BOUNDARY
);
fileExplain
.
append
(
"\r\n"
);
fileExplain
.
append
(
"Content-Disposition: form-data;name=\""
+
uploadFile
.
getParameterName
()+
"\";filename=\""
+
uploadFile
.
getFilname
()
+
"\"\r\n"
);
fileExplain
.