`
wjm901215
  • 浏览: 154931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[Android算法] http 上传文件的方法

阅读更多
/**

         * 

         * sendMultipartDataToHttpServer

         * 使用post方法请求web服务器,并且当表单数据为:multipart/form-data格式。http请求使用{@link#HTTP_ENCODING}编码<br/>

         * 返回json数据,支持文件名中文上传和多文件上传,不支持断点上传,要正确编码服务端返回{@link#HTTP_ENCODING}编码<br/>

         * @param url

         * @param files 文件表单域

         * @param fields 非文件表单域

         * @return JSONObject

         * @throws Exception 

         * @exception 

         * @since  0

         */

        public static JSONObject sendMultipartDataToHttpServer(URL url,

                        final Map<String, File> files, final Map<String, String> fields,

                        final UsernamePasswordCredentials credentials) throws IOException ,JSONException,Exception{

                URL myurl = null;

                String queryString = "";

                // 其他的表单域

                if (fields != null) {

                        for (Map.Entry<String, String> entry : fields.entrySet()) {

                                queryString += "&" + URLEncoder.encode(entry.getKey(),HTTP_ENCODING) + "="

                                                + URLEncoder.encode(entry.getValue(), HTTP_ENCODING);

                        }

                }

                if (!queryString.equals("")) {

                        queryString = queryString.replaceFirst("&", "?");

                } else {

                }



                myurl = new URL(url.getProtocol(), url.getHost(),url.getPort(), url.getPath()

                                + queryString);

                HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();

                conn.setConnectTimeout(UPLOAD_REQUEST_TIMEOUT);

                conn.setRequestMethod(HTTP_METHOD.POST.toString());

                conn.setDoInput(true);

                conn.setDoOutput(true);

                conn.setUseCaches(false);



                String boundary = "laohuidi_" + java.util.UUID.randomUUID().toString()

                                + "_laohuidi";

                conn.setRequestProperty(

                                                "Accept",

                                                "image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,application/x-shockwave-flash,application/x-quickviewplus,*/*");

                conn.setRequestProperty("keep-alive", "300");

                conn.setRequestProperty(

                                                "user-agent",

                                                "Mozilla/0 (Windows; U; Windows NT 2; zh-CN; rv:6) Gecko/20091201 Firefox/6 GTB6");

                conn.setRequestProperty("accept-language", "zh-cn,zh;q=5");

                conn.setRequestProperty("Connection", "Keep-Alive");

                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+ boundary);



                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

                // 乱码问题 可以试下 PrintWriter out = new PrintWriter(new

                // OutputStreamWriter(connection.getOutputStream(),"utf-8"));

                dos = new DataOutputStream(conn.getOutputStream());

                int bytesRead, bytesAvailable, bufferSize;

                byte[] buffer;

                int maxBufferSize = IO_BUFFER_SIZE;

                String tem = "";

                if(files!=null)

                for (Map.Entry<String, File> entry : files.entrySet()){

                        // 分隔符开头

                        dos.writeBytes(TWO_HYPHENS + boundary + LINEND);

                        // create a buffer of maximum size

                        FileInputStream fileInputStream = new FileInputStream(entry.getValue());

                        bytesAvailable = fileInputStream.available();

                        bufferSize = Math.min(bytesAvailable, maxBufferSize);

                        buffer = new byte[bufferSize];

                        // read file and write it into form...

                        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                        tem = entry.getValue().getName();

                        dos.writeBytes("Content-Disposition:form-data;name=\""+entry.getKey()+"\";"+ "filename=\"");

                        dos.writeUTF(tem);// 中文的文件名使用这里

                        dos.writeBytes("\"" + LINEND);

                        dos.writeBytes("Content-Type:image/jpg" + LINEND + LINEND);//类型的判断暂时不处理

                        while (bytesRead > 0) {

                                dos.write(buffer, 0, bufferSize);

                                bytesAvailable = fileInputStream.available();

                                bufferSize = Math.min(bytesAvailable, maxBufferSize);

                                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                        }

                        // close streams

                        fileInputStream.close();

                        dos.writeBytes(LINEND);

                }

                // http 结束符

                dos.writeBytes(TWO_HYPHENS + boundary + TWO_HYPHENS);

                dos.writeBytes(LINEND);



                dos.flush();

                dos.close();

                // 返回类型

                String responseType = conn.getHeaderField("Content-Type");

                // 正常返回而且必须为json类型

                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK

                                && responseType != null

                                && responseType.indexOf(HTTP_JSON_TYPE) >= 0) {

                        responseType = (convertStreamToString(conn.getInputStream()));



                } else {

                        responseType = "{}";

                }

                try{conn.disconnect();}catch(Exception e){}

                return new JSONObject(responseType);

        }

 

分享到:
评论

相关推荐

    android 仿ES文件浏览器源码.rar

    ES文件浏览器支持云存储服务的接入,因此源码可能涉及HTTP/HTTPS请求,如使用`OkHttp`或`Volley`库进行网络通信,以及上传下载文件的实现。 8. **SQLite数据库** 应用可能使用SQLite数据库来存储用户的偏好设置、...

    androidstudio视频文件压缩Demo

    在Android开发中,处理视频文件是一项常见的任务,尤其是在创建应用程序时需要上传或处理用户拍摄的视频。本示例“androidstudio视频文件压缩Demo”提供了一个详细的解决方案,它演示了如何在Android Studio项目中...

    Android中Socket大文件断点上传

    在Android开发中,当需要传输大文件,如视频、音频或大型数据文件时,传统的HTTP方式可能会遇到性能瓶颈,因为HTTP请求通常不支持断点续传。这时,开发者可以选择使用Socket进行自定义的文件传输,以实现大文件的...

    Android SM2、SM3、SM4 算法支持 Service Provider 及证书制作软件包

    Android SM2、SM3、SM4 算法支持 Service Provider 及证书制作软件包 国密算法 JCAJCE Service Provider,适应版本 Android 4.2.2~7.0 支持 SM2 的 KeyFactory、KeyPairGenerator、Cipher、Signature、X.509 ...

    Android 大文件上传秒传之在线版

    在Android平台上,大文件上传和秒传功能是许多应用程序的核心需求,尤其是在云存储、社交分享和协作工具中。本文将详细解析如何实现“Android大文件上传秒传之在线版”的技术要点。 首先,理解“秒传”功能。秒传是...

    Android文件管理器源代码

    5. **多线程处理**:为了提高性能,源代码可能使用`AsyncTask`、`IntentService`或`Worker`来执行耗时的文件操作,比如文件的上传和下载,避免阻塞主线程。 6. **文件选择器**:源代码可能会包含一个文件选择对话框...

    Android 封装好的录音实现方法、仿微信语音、麦克风录音、发送语音,附带源码及apk

    - **发送语音**:如果要实现语音发送功能,可以使用网络请求将录音文件上传到服务器,并在接收端下载播放。这通常涉及到HTTP/HTTPS请求,可能需要用到`OkHttp`或`Retrofit`等网络库。 在提供的源码`...

    opencv_3.3_android_sdk+so库(x86_so库文件太大,已经分开上传)

    由于x86库文件过大,已分开上传,开发者需要根据设备的处理器架构选择合适的库。 5. **X86架构**:X86是Intel和AMD处理器使用的指令集,通常用在桌面和一些高性能的Android设备上。由于其文件较大,为了方便下载和...

    android-simpl3r-文件上传master.zip

    【Android simpl3r 文件上传项目详解】 Android Simpl3r 是一个专为Android平台设计的应用程序,其核心功能是实现文件上传。该项目的源代码提供了一个很好的学习资源,可以帮助开发者理解和实践Android应用中的文件...

    Android应用源码之Android中Socket大文件断点上传.rar

    本压缩包中的“Android应用源码之Android中Socket大文件断点上传”是一个很好的学习资源,它展示了如何在Android平台上实现通过Socket进行大文件的断点续传功能。这里我们将详细探讨这一主题,包括Socket通信的基本...

    七牛Android上传token的生成和上传

    3. 调用上传接口:使用七牛提供的UploadManager,选择本地文件并指定上传策略,然后调用start()方法启动上传。 4. 处理上传结果:监听UploadManager的回调,获取上传状态和返回信息,如成功、失败或网络问题。 在...

    Android下3DES加密算法的JNI实现(完善版)

    之前上传过:编译Android下3DES加密算法的.SO文件及源码,地址:http://download.csdn.net/detail/wtbee/6411155。不过其中存在Jni底层资源释放的问题,长时间运行会导致JNI报错使得程序闪退。这一版修改了此Bug。...

    Netty 文件上传获取进度条

    Netty 提供了一种更高效的方法,即结合WebSocket和NIO,实现服务器主动推送文件上传进度。 WebSocket 是一种在单个TCP连接上进行全双工通信的协议,它可以提供持久化的连接,使得服务器可以主动向客户端推送数据。...

    文件android 增量更新 服务端运行文件

    然后,将补丁文件和新版本的APK元数据(如版本号)上传至服务器。客户端在检测到更新时,下载补丁并应用到本地APK,完成更新。 为了在Android系统中应用bsdiff生成的补丁,还需要一个客户端库来解析和应用补丁。...

    Android资源文件混淆工具

    在Android中,代码混淆通常是针对Java字节码,它通过重命名类、方法和变量,以及缩短和打乱控制流来使反编译后的代码难以阅读。然而,资源文件混淆则是针对XML布局文件、图片、字符串等资源进行操作,使得攻击者难以...

    Android开发中的文件操作工具类FileUtil完整实例

    2. 高效快速:FileUtil类使用了高效的文件操作算法,能够快速地完成文件操作。 3. 广泛应用:FileUtil类可以应用于多种场景,例如文件下载、上传、管理和数据存储等。 五、结论 FileUtil类是一个功能强大且实用的...

    android 拍照上传图片

    在Android平台上,拍照上传图片是一项常见的功能,广泛应用于社交应用、电商、个人日记等场景。这一功能涉及到多个关键步骤和技术,包括相机权限管理、图片捕获、图片处理(如裁剪)以及网络上传。以下是对这些知识...

    Android H264摄像头录制视频

    在Android平台上进行H264视频录制涉及到许多关键知识点,包括多媒体框架、编码技术、文件存储和网络传输等。以下是对这些方面的详细说明: 1. **Android多媒体框架**:Android系统提供了一个强大的多媒体框架,包括...

    android 批量上传图片

    在Android平台上,批量上传图片至服务器是一项常见的任务,尤其在社交应用、云存储服务或文件共享平台中。本文将深入探讨如何实现这一功能,包括从相册选择图片和使用相机拍摄图片,以及如何构建上传逻辑。 一、...

Global site tag (gtag.js) - Google Analytics