项目后台是用Spring搭建的,上传图片一直不行,最后的最后终于解决了,记下了,以后还会用的着。
android端 上传方法:
/**
* 上传参数和文件
* @param url
* @param paramters
* @param filesMap
* @return
* @throws Exception
*/
public static String uploadFile2(String url, Map<String, String> paramters,
Map<String, File> filesMap) throws Exception {
System.out.println("uploadFile2---------------");
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(
CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
/* 建立HTTPPost对象 */
HttpPost httpRequest = new HttpPost(url);
String strResult = "doPostError";
// 文件传输
MultipartEntity mEntity = new MultipartEntity();
//添加上传参数
for (Map.Entry<String, String> entry : paramters.entrySet()) {
ContentBody strBody = new StringBody(entry.getValue());
mEntity.addPart(entry.getKey(), strBody);
}
//添加上传的文件
Iterator<String> iterator = filesMap.keySet().iterator();
while (iterator.hasNext()) {
String fileName = iterator.next();
ContentBody cBody = new FileBody(filesMap.get(fileName));
mEntity.addPart(fileName, cBody);
System.out.println("while-----iterator fileName:"+fileName+" file:"+filesMap.get(fileName));
}
System.out.println("file length----->" + mEntity.getContentLength());
httpRequest.setEntity(mEntity);
/* 发送请求并等待响应 */
HttpResponse httpResponse = httpClient.execute(httpRequest);
/* 若状态码为200 ok */
if (httpResponse.getStatusLine().getStatusCode() == 200) {
/* 读返回数据 */
strResult = EntityUtils.toString(httpResponse.getEntity());
} else {
strResult = "Error Response: "
+ httpResponse.getStatusLine().toString();
}
// 关闭连接
httpClient.getConnectionManager().shutdown();
return strResult;
}
没什么好说的不过多解释。
后台原来的接收文件方法:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("do post");
// 设置request编码,主要是为了处理普通输入框中的中文问题
request.setCharacterEncoding("utf-8");
System.out.println("ShareCon----->request:"
+ request.getAttributeNames().toString());
Enumeration enumeration = request.getAttributeNames();
while (enumeration.hasMoreElements()) {
Object object = enumeration.nextElement();
System.out.println("enum----->" + object.toString());
}
// 这里对request进行封装,RequestContext提供了对request多个访问方法
org.apache.commons.fileupload.RequestContext requestContext = new ServletRequestContext(
request);
// 判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
if (FileUpload.isMultipartContent(requestContext)) {
PrintWriter out = response.getWriter();
// String savePath = getSavePath(request);
String pathroot = this.getClass().getClassLoader().getResource("/")
.getPath();
String path = pathroot.substring(1, pathroot.length() - 8)
+ "resources/img";
path = java.net.URLDecoder.decode(path, "UTF-8");
String savePath = path;
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
factory.setRepository(new File(savePath));
File dir = new File(savePath);
if (!dir.exists()) {
dir.mkdirs();
}
// System.out.print("已经生成临时文件");
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(100000 * 1024 * 1024);
List items = new ArrayList();
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
items = upload.parseRequest(request);
System.out.println("items------->" + items.size());
} catch (FileUploadException e1) {
System.out.println("文件上传发生错误" + e1.getMessage());
}
// 下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
System.out.println("sc-------it----");
while (it.hasNext()) {
System.out.println("it=" + it);
DiskFileItem fileItem = (DiskFileItem) it.next();
// 如果是普通字段
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName()
+ " "
+ fileItem.getName()
+ " "
+ new String(fileItem.getString().getBytes(
"iso8859-1"), "gbk"));
} else {
System.out.println(fileItem.getFieldName() + " "
+ fileItem.getName() + " "
+ fileItem.isInMemory() + " "
+ fileItem.getContentType() + " "
+ fileItem.getSize());
// 保存文件,其实就是把缓存里的数据写到目标路径下
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileItem.getName());
String fileName = getFileName(request, fileItem
.getName());
File newFile = new File(savePath + fileName);
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
out.print("{\"error\":\"upload error!\"}");
}
out.print("{\"url\":\"/upload/" + fileName + "\"}");
} else {
System.out.println("文件没有选择 或 文件内容为空");
}
}
}
}
}
items = upload.parseRequest(request); 得到的item的长度一直为0 ,上网找了找,试了一些方法,都没解决。
最后改成了这样
@RequestMapping(value = "/upload_pic", method = RequestMethod.POST)
@ResponseBody
public void uploadFile(HttpServletRequest request,
HttpServletResponse response,int id) throws IOException {
System.out.println("uploadFile------>");
DefaultMultipartHttpServletRequest req = (DefaultMultipartHttpServletRequest) request;
request.setCharacterEncoding("UTF-8");
Map<String, MultipartFile> files = req.getFileMap();
String pathroot = this.getClass().getClassLoader().getResource("/")
.getPath();
String path = pathroot.substring(1, pathroot.length() - 8)
+ "resources/img/";
for (String key : files.keySet()) {
MultipartFile file = files.get(key);
System.out.println(file.getName());
System.out.println(file.getSize());
FileOutputStream fileOutput;
path = java.net.URLDecoder.decode(path, "UTF-8");
String fileName = path+key;
System.out.println("save_path:"+fileName);
try {
fileOutput = new FileOutputStream(fileName);
fileOutput.write(file.getBytes());
fileOutput.flush();
fileOutput.close();
String filename = "xxxxxxxxxxxxxxxxxxx";
int nums = shareService.addSharePic(id,filename);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解决问题
// 转型为MultipartHttpRequest
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 根据前台的name名称得到上传的文件 "file" 是前端 的参数名, 值就是 文件对象 File
MultipartFile file = multipartRequest.getFile("file");
String fileName = file.getOriginalFilename();
相关推荐
在Android开发中,搭建服务器是实现应用程序与后台数据交互的关键步骤。这涉及到网络编程、HTTP协议、RESTful API设计以及可能的数据库操作等技术。以下将详细介绍如何在Android环境中搭建服务器,实现简单的交互。 ...
Spring Boot是Spring框架的一个扩展,它简化了Spring应用的初始搭建以及开发过程。通过自动配置和起步依赖,Spring Boot使得开发者能够快速启动一个功能完备的应用。在本项目中,Spring Boot将作为后端的核心框架,...
android客户端连接javaweb服务器,java web服务器采用SSM(spring+springMVC+mybatis)框架。服务器端即可以处理android请求,又可以处理浏览器jsp页面请求。
【Android Studio 70 歌曲服务器搭建与歌曲App开发详解】 在移动应用开发领域,Android Studio是一款不可或缺的集成开发环境(IDE),尤其对于构建Android应用程序来说。在本教程中,我们将深入探讨如何使用Android...
本文将深入探讨如何利用Android的AQuery库结合Ajax技术来访问由SSH搭建的后台Java Web服务器,从而实现数据的动态获取和提交。 首先,我们需要了解AQuery。AQuery是Android平台上的一个强大的图片加载和网络请求库...
Spring Boot是Java领域的一个轻量级框架,它简化了Spring应用的初始搭建以及开发过程。通过自动配置、起步依赖等特性,Spring Boot使得开发者能够快速启动和运行项目。 描述中的“集成角色,菜单,用户,权限”表明...
后台服务器负责接收前端的请求,进行业务逻辑处理,通常采用Java的Spring Boot框架搭建。通过RESTful API设计规范,定义一套清晰的HTTP接口,使前端与后台通信更加便捷。接口设计应涵盖菜品管理、订单处理、用户认证...
3. **SpringBoot**:这是一个基于Spring框架的轻量级开发工具,简化了配置,便于快速搭建和部署Web应用。SpringBoot内置了Tomcat服务器,支持RESTful API设计,非常适合构建后台服务。 4. **Maven**:是Java项目管理...
【标题】"Android网上商城" 是一个综合性的项目,它涵盖了Android客户端应用程序和服务器端...通过深入研究和模仿这个项目,开发者可以掌握从用户界面设计到后台服务搭建的全过程,为自己的职业发展打下坚实的基础。
部署时,Spring Boot应用可以被打包成可执行的JAR文件,部署到服务器上;Android应用则需打包成APK文件,供用户下载安装。 通过这个项目,学生不仅可以掌握Java后端开发和Android移动应用开发的基本技能,还能了解...
这个"android_app_server_demo.zip"文件显然包含了关于如何在Android环境中搭建一个简单后端服务器的示例代码和教程。我们将深入探讨这个过程,以及涉及到的关键技术。 首先,我们关注的是"jsp+java+tomcat"这个...
内容概要:文章介绍了三个基于 Java 实施的具体案例——Web 应用(Spring Boot RESTful API 构建)、桌面应用程序(JavaFX 实现书籍管理系统)、以及移动应用开发(利用 Android 工具链完成天气展示APP),详述了...
2. **开发环境搭建**:安装Android Studio、配置模拟器。 3. **UI设计**:布局管理器的使用、常用控件的属性设置。 4. **Activity与Intent**:Activity生命周期、Intent传递数据。 5. **数据存储**:...
在压缩包中,"安卓程序客户端"包含了上述提到的Android应用的所有源代码和资源文件,而"安卓程序服务端"可能包含了一个简单的服务器端实现,如使用Node.js、Java Spring Boot或PHP Laravel等技术搭建,用于处理...
1. **UI设计**:项目中的布局设计使用了Android的XML布局文件,包括LinearLayout、RelativeLayout、GridLayout以及RecyclerView等,展示了如何构建响应式和用户友好的界面。 2. **网络通信**:应用可能使用了`...
此项目源码涵盖了UI设计(使用XML布局文件)、Activity管理、Intent通信、Service后台服务、BroadcastReceiver广播接收器等多个核心组件的使用。 2. **仿腾讯QQ功能实现** - 登录注册:涉及网络请求,通常使用HTTP...
这个项目是为Android若水新闻客户端提供服务端支持的源代码,旨在帮助开发者学习如何构建一个新闻客户端的后台系统。服务端通常负责处理客户端的请求,如数据的获取、存储和更新,以及与数据库的交互等。以下将详细...
在IT行业中,服务器搭建是构建网络服务的基础,尤其在Android应用开发中,服务器的作用尤为重要。本文将详细解析如何搭建一个支持Android应用的服务器,并涉及相关的数据库安装与配置。 首先,我们要理解服务器的...
这通常涉及到对服务器环境的搭建,包括安装必要的库、服务和框架。开发者需要熟悉Linux命令行操作,以及可能用到的脚本语言如bash、python等。手工端的优势在于可以灵活调整和优化服务器配置,以适应不同规模的游戏...
原生双端影视详细视频搭建教程是一套针对影视APP开发的综合教程,旨在帮助开发者或爱好者构建自己的双端(Android和iOS)影视应用。这个教程已经去除了验证码注册功能,这意味着用户在注册过程中将不再需要通过...