Android端
//region 上传图片
public static void uploadImg(String name,String imagePath,String imgFileName, String type,Callback callback){
OkHttpClient okHttpClient;
File file = new File( imagePath );
RequestBody image = RequestBody.create( MediaType.parse( "image/*" ), file );
RequestBody requestBody = new MultipartBody.Builder()
.setType( MultipartBody.FORM )
.addFormDataPart("file", imgFileName, image )
// .addFormDataPart("pattern",type)
.build();
okhttp3.Request request = new okhttp3.Request.Builder()
.url( url +name)
.post( requestBody )
.build();
okhttp3.OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
okHttpClient = httpBuilder.build();
okHttpClient.newCall( request ).enqueue( callback );
}
//endregion
Servlet服务端
public void uploadFilesSpecifyPath(HttpServletRequest request, HttpServletResponse response) {
//获得磁盘文件条目工厂。
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取文件上传需要保存的路径,upload文件夹需存在。
// String path = request.getSession().getServletContext().getRealPath("/upload");
String path = "F:\\test";
//设置暂时存放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的话会占用过多内存所以设置存储室。
factory.setRepository(new File(path));
//设置缓存的大小,当上传文件的容量超过缓存时,就放到暂时存储室。
factory.setSizeThreshold(1024*1024);
//上传处理工具类(高水平API上传处理?)
ServletFileUpload upload = new ServletFileUpload(factory);
try{
//调用 parseRequest(request)方法 获得上传文件 FileItem 的集合list 可实现多文件上传。
Map<String, List<FileItem>> lists = upload.parseParameterMap(request);
// file=[name=head.jpg, StoreLocation=null, size=3366 bytes, isFormField=false, FieldName=file]实例数据
// Util.log(TAG,lists);
List<FileItem> list = lists.get("file");
for(FileItem item:list){
//获取表单属性名字。
String name = item.getFieldName();
//如果获取的表单信息是普通的文本信息。即通过页面表单形式传递来的字符串。
if(item.isFormField()){
//获取用户具体输入的字符串,
String value = item.getString();
Util.log(TAG,value);
request.setAttribute(name, value);
}
//如果传入的是非简单字符串,而是图片,音频,视频等二进制文件。
else{
//获取路径名
String value = item.getName();
//取到最后一个反斜杠。
int start = value.lastIndexOf("\\");
//截取上传文件的 字符串名字。+1是去掉反斜杠。
String filename = value.substring(start+1);
request.setAttribute(name, filename);
/*直接写到文件中。 */
item.write(new File(path,filename));
}
}
}catch(Exception e){
e.printStackTrace();
}
}