`

android 上传文件到 spring 搭建的后台

阅读更多

项目后台是用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服务器搭建

    在Android开发中,搭建服务器是实现应用程序与后台数据交互的关键步骤。这涉及到网络编程、HTTP协议、RESTful API设计以及可能的数据库操作等技术。以下将详细介绍如何在Android环境中搭建服务器,实现简单的交互。 ...

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    Spring Boot是Spring框架的一个扩展,它简化了Spring应用的初始搭建以及开发过程。通过自动配置和起步依赖,Spring Boot使得开发者能够快速启动一个功能完备的应用。在本项目中,Spring Boot将作为后端的核心框架,...

    Android客户端+SSM框架服务器端开发案例实践

    android客户端连接javaweb服务器,java web服务器采用SSM(spring+springMVC+mybatis)框架。服务器端即可以处理android请求,又可以处理浏览器jsp页面请求。

    android studio 70 歌曲服务器搭建 歌曲app 下载 完整代码 发布版

    【Android Studio 70 歌曲服务器搭建与歌曲App开发详解】 在移动应用开发领域,Android Studio是一款不可或缺的集成开发环境(IDE),尤其对于构建Android应用程序来说。在本教程中,我们将深入探讨如何使用Android...

    利Android AQuery中ajax访问SSH搭建的后台Java Web服务器

    本文将深入探讨如何利用Android的AQuery库结合Ajax技术来访问由SSH搭建的后台Java Web服务器,从而实现数据的动态获取和提交。 首先,我们需要了解AQuery。AQuery是Android平台上的一个强大的图片加载和网络请求库...

    采用spring boot的项目,一个后台管理系统

    Spring Boot是Java领域的一个轻量级框架,它简化了Spring应用的初始搭建以及开发过程。通过自动配置、起步依赖等特性,Spring Boot使得开发者能够快速启动和运行项目。 描述中的“集成角色,菜单,用户,权限”表明...

    计算机专业论文android无线点餐系统+后台+数据库

    后台服务器负责接收前端的请求,进行业务逻辑处理,通常采用Java的Spring Boot框架搭建。通过RESTful API设计规范,定义一套清晰的HTTP接口,使前端与后台通信更加便捷。接口设计应涵盖菜品管理、订单处理、用户认证...

    闲物转系统(后台+ android).zip

    3. **SpringBoot**:这是一个基于Spring框架的轻量级开发工具,简化了配置,便于快速搭建和部署Web应用。SpringBoot内置了Tomcat服务器,支持RESTful API设计,非常适合构建后台服务。 4. **Maven**:是Java项目管理...

    android网上商城

    【标题】"Android网上商城" 是一个综合性的项目,它涵盖了Android客户端应用程序和服务器端...通过深入研究和模仿这个项目,开发者可以掌握从用户界面设计到后台服务搭建的全过程,为自己的职业发展打下坚实的基础。

    基于Spring Boot MySQL实现洗衣店预约系统,Android应用【优质毕业设计、课程设计项目】.zip

    部署时,Spring Boot应用可以被打包成可执行的JAR文件,部署到服务器上;Android应用则需打包成APK文件,供用户下载安装。 通过这个项目,学生不仅可以掌握Java后端开发和Android移动应用开发的基本技能,还能了解...

    android_app_server_demo.zip

    这个"android_app_server_demo.zip"文件显然包含了关于如何在Android环境中搭建一个简单后端服务器的示例代码和教程。我们将深入探讨这个过程,以及涉及到的关键技术。 首先,我们关注的是"jsp+java+tomcat"这个...

    基于Java的多种应用场景项目实例:Spring Boot RESTful API & JavaFX桌面应用&Android开发

    内容概要:文章介绍了三个基于 Java 实施的具体案例——Web 应用(Spring Boot RESTful API 构建)、桌面应用程序(JavaFX 实现书籍管理系统)、以及移动应用开发(利用 Android 工具链完成天气展示APP),详述了...

    JAVA+JSP+Servlet+android+SSH视频教程全集+项目视频 亲自总结

    2. **开发环境搭建**:安装Android Studio、配置模拟器。 3. **UI设计**:布局管理器的使用、常用控件的属性设置。 4. **Activity与Intent**:Activity生命周期、Intent传递数据。 5. **数据存储**:...

    基于Android的图书管理系统

    在压缩包中,"安卓程序客户端"包含了上述提到的Android应用的所有源代码和资源文件,而"安卓程序服务端"可能包含了一个简单的服务器端实现,如使用Node.js、Java Spring Boot或PHP Laravel等技术搭建,用于处理...

    android美食天下源代码

    1. **UI设计**:项目中的布局设计使用了Android的XML布局文件,包括LinearLayout、RelativeLayout、GridLayout以及RecyclerView等,展示了如何构建响应式和用户友好的界面。 2. **网络通信**:应用可能使用了`...

    Android项目源码仿腾讯QQ毕设包括论

    此项目源码涵盖了UI设计(使用XML布局文件)、Activity管理、Intent通信、Service后台服务、BroadcastReceiver广播接收器等多个核心组件的使用。 2. **仿腾讯QQ功能实现** - 登录注册:涉及网络请求,通常使用HTTP...

    Android若水新闻客户端中服务端源码

    这个项目是为Android若水新闻客户端提供服务端支持的源代码,旨在帮助开发者学习如何构建一个新闻客户端的后台系统。服务端通常负责处理客户端的请求,如数据的获取、存储和更新,以及与数据库的交互等。以下将详细...

    服务器搭建Android

    在IT行业中,服务器搭建是构建网络服务的基础,尤其在Android应用开发中,服务器的作用尤为重要。本文将详细解析如何搭建一个支持Android应用的服务器,并涉及相关的数据库安装与配置。 首先,我们要理解服务器的...

    【新斗罗大陆】Linux手工端+安卓苹果双端+运营后台+授权多功能后台

    这通常涉及到对服务器环境的搭建,包括安装必要的库、服务和框架。开发者需要熟悉Linux命令行操作,以及可能用到的脚本语言如bash、python等。手工端的优势在于可以灵活调整和优化服务器配置,以适应不同规模的游戏...

    原生双端影视详细视频搭建教程(已去除验证码注册功能)

    原生双端影视详细视频搭建教程是一套针对影视APP开发的综合教程,旨在帮助开发者或爱好者构建自己的双端(Android和iOS)影视应用。这个教程已经去除了验证码注册功能,这意味着用户在注册过程中将不再需要通过...

Global site tag (gtag.js) - Google Analytics