`
gaojingsong
  • 浏览: 1209909 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【基于HttpURLConnection模拟Http协议上传文件】

阅读更多

永久链接: http://gaojingsong.iteye.com/blog/2414484

预览文章: 【Http文件上传协议解析】

首先是请求头:

最重要的内容是Content-Type,他的内容中是:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6TAB8KxvuJTZYfUn

用分号隔开了不同的参数: 

第一个参数multipart/form-data是必须的,是指提交的表单中有附件 

第二个参数boundary表示分割线,请求体中会用来分割不同的请求参数 

至于其他参数,在自己写请求的时候直接模仿传过去即可。

 

核心代码

package com.example.fileupload.controller;

 

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.HashMap;

import java.util.Set;

 

public class HttpUrlConnectionDemo {

 

/**

* @param args

*/

public static void main(String[] args) {

// 上传文件测试

String actionURL ="http://localhost:9090/mgr/upload";

String uploadFile="c:/examples.cfg";

HashMap<String, String> parameters = new HashMap<String, String>();

parameters.put("email", "demo@123.com");

singleFileUploadWithParameters( actionURL,  uploadFile, parameters );

 

}

 

/** 

* @author Johnson 

* @method singleFileUploadWithParameters 

* @description 集上传单个文件与传递参数于一体的方法 

* @param actionURL 上传文件的URL地址包括URL 

* @param fileType 文件类型(枚举类型) 

* @param uploadFile 上传文件的路径字符串 

* @return String("" if no response get) 

* @attention 上传文件name为file(服务器解析) 

* */  

public static String singleFileUploadWithParameters(String actionURL, String uploadFile, 

HashMap<String, String> parameters){  

   String end = "\r\n";  

   String twoHyphens = "--";  

   String boundary = "---------------------------7e0dd540448";  

   String response = "";  

   try{  

       URL url = new URL(actionURL);  

       HttpURLConnection connection = (HttpURLConnection)url.openConnection();  

       //发送post请求需要下面两行  

       connection.setDoInput(true);  

       connection.setDoOutput(true);  

       //设置请求参数  

       connection.setUseCaches(false);  

       connection.setRequestMethod("POST");  

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

       connection.setRequestProperty("Charset", "UTF-8");  

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

       //获取请求内容输出流                          

       DataOutputStream ds = new DataOutputStream(connection.getOutputStream());  

       String fileName = uploadFile.substring(uploadFile.lastIndexOf("/") + 1);  

       //开始写表单格式内容  

       //写参数  

       Set<String> keys = parameters.keySet();  

       for(String key : keys){  

           ds.writeBytes(twoHyphens + boundary + end);  

           ds.writeBytes("Content-Disposition: form-data; name=\"");  

           ds.write(key.getBytes());  

           ds.writeBytes("\"" + end);  

           ds.writeBytes(end);  

           ds.write(parameters.get(key).getBytes());  

           ds.writeBytes(end);  

       }  

       //写文件  

       ds.writeBytes(twoHyphens + boundary + end);  

       ds.writeBytes("Content-Disposition: form-data; " + "name=\"file1\"; " + "filename=\"");  

       //防止中文乱码  

       ds.write(fileName.getBytes());  

       ds.writeBytes("\"" + end);  

       ds.writeBytes("Content-Type: text/plain" + end);  

       ds.writeBytes(end);  

       //根据路径读取文件  

       FileInputStream fis = new FileInputStream(uploadFile);  

       byte[] buffer = new byte[1024];  

       int length = -1;  

       while((length = fis.read(buffer)) != -1){  

           ds.write(buffer, 0, length);  

       }  

       ds.writeBytes(end);  

       fis.close();  

       ds.writeBytes(twoHyphens + boundary + twoHyphens + end);  

       ds.writeBytes(end);  

       ds.flush();  

       try{  

           //获取URL的响应  

           BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));  

           String s = "";  

           String temp = "";  

           while((temp = reader.readLine()) != null){  

               s += temp;  

           }  

           response = s;  

           reader.close();  

       }catch(IOException e){  

           e.printStackTrace();  

           System.out.println("No response get!!!");  

       }  

       ds.close();  

   }catch(IOException e){  

       e.printStackTrace();  

       System.out.println("Request failed!");  

   }  

   return response;  

}  

 

}

 

 

结果验证:



 

  • 大小: 239.9 KB
0
0
分享到:
评论

相关推荐

    java代码模拟http上传文件_代码_类包

    本文将深入探讨如何使用Java实现HTTP文件上传,同时基于提供的压缩包资源,我们将详细介绍相关代码和类库。 首先,了解HTTP文件上传的基本原理。在HTTP中,文件上传通常使用POST方法,通过表单数据或者Multipart/...

    rest webserverce 文件上传

    在测试类中,可能还会使用Java的`HttpURLConnection`或第三方库如Apache HttpClient来模拟文件上传。 在部署这个DEMO时,你需要确保有Tomcat服务器环境,并将项目结构配置正确。项目中的`web.xml`文件应配置Jersey...

    java 实现百度网盘模拟

    【标题】:基于Java实现的百度网盘模拟系统 在当今信息化时代,网盘服务已经成为存储和分享数据的重要工具。本项目旨在通过Java技术栈,模拟实现一个类似于百度网盘的客户端/服务器(C/S)架构系统,为用户提供多...

    java 接口待测试时代发生的发生的发

    对于文件上传,Java通常会使用HttpURLConnection或者Apache HttpClient库来处理HTTP请求,而在服务器端,可能使用Spring Framework的MultipartFile接口来接收并处理上传的文件。文件上传可能涉及到的细节包括:文件...

    java msn实例

    另外,如果项目中包含了文件传输功能,那么可能还需要用到Java的文件操作API和流的组合,以实现文件的上传和下载。 总的来说,JavaMSN实例展示了Java在网络编程、协议解析、XML处理和多线程方面的应用。通过这个...

    curljava_curljava

    在实际项目中,你可能需要根据curl命令的具体参数和行为来调整这个代码,比如处理POST请求、上传文件、设置认证等。 由于提供的文件列表只有一个`curljava`,可能是源代码、文档或者其他资源。如果你能提供更多的...

    android c# webservice 实现

    WebService是一种基于HTTP协议的、平台无关的通信方式,它允许不同系统间的应用程序通过网络共享数据和功能。常见的WebService规范有SOAP(Simple Object Access Protocol)和REST(Representational State Transfer...

    网络硬盘java源码

    7. **文件上传与下载**:文件传输可能通过HTTP的POST和GET方法实现,Java的HttpURLConnection或者第三方库如Apache HttpClient可以用来处理这些网络请求。 8. **文件分块上传与断点续传**:为了处理大文件,源码...

    狼王-HttpPost请求和JSON解析

    与HttpGet不同,HttpPost可以传输大量数据,包括文件上传,且数据不会显示在URL上,因此对于敏感信息的传递更为安全。在Java中,我们可以使用HttpURLConnection或者HttpClient库来实现HttpPost请求,通常需要设置...

    云盘 网盘 Android 安卓 毕业设计 课程设计 大作业.zip

    - **HTTP/HTTPS协议**:云盘和网盘服务通常基于HTTP或更安全的HTTPS进行通信,用于上传、下载文件。 - **RESTful API**:应用通过调用云服务商提供的RESTful接口实现文件操作。 - **JSON数据交换格式**:用于传输...

    java socket 学习资料

    Java Socket是Java编程语言中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了低级别的网络连接功能。Socket在Java中被广泛用于构建客户端-服务器应用,例如创建Web服务器、聊天应用程序、文件传输等。以下是...

    Java 网络编程

    - **HttpURLConnection**:Java标准库中的`HttpURLConnection`类用于实现HTTP协议,可以进行GET、POST等操作。 - **HttpClient**:Apache HttpClient库提供了更高级的HTTP客户端功能,支持更多HTTP特性。 4. **...

    JAVA网络编程经典视频教程 附带源码

    6. **HTTP协议**:讲解基于HTTP协议的网络应用开发,如使用HttpURLConnection或HttpClient类。 7. **网络安全**:讨论SSL/TLS加密,身份验证和授权,以及网络安全的最佳实践。 其次,"NetProject.rar"可能是包含...

    OpenWindow.zip_网络编程_Java_

    文件上传通常基于HTTP协议,尤其是POST方法。POST请求用于向服务器发送数据,例如文件内容。理解HTTP头、状态码以及请求体的构造对于实现文件上传至关重要。 3. **Multipart/form-data**: 由于文件上传涉及到二...

    JavaNetworkProgramming.pdf

    10. **匿名FTP下载**:利用`java.net.FTPClient`类实现文件的上传和下载功能。 11. **Socket通信**:掌握Socket编程的基本原理,实现客户端与服务器之间的低级网络通信。 12. **远程方法调用(RMI)**:Java的RMI...

    http_example

    10. **多部分请求**:对于上传文件或发送复杂数据,HTTP允许使用多部分请求(multipart/form-data),Java API提供了相应支持。 11. **WebSocket**:虽然不是HTTP,但WebSocket是一种在单个TCP连接上进行全双工通信...

    Computer-Networks:基本计算机网络概念的实现

    4. **HTTP请求与响应**:模拟浏览器发送GET/POST请求,解析HTTP响应,理解HTTP协议的头部和状态码。 5. **文件上传与下载**:通过FTP或HTTP实现文件在客户端和服务器之间的传输。 6. **网络安全**:学习如何使用SSL/...

    Android 仿新浪微博

    【Android 仿新浪微博】项目是基于Android平台的一个开源项目,其目标是实现一个类似新浪微博的应用。这个项目对于学习Android开发,尤其是社交应用的构建,提供了丰富的实践参考。 首先,项目的核心在于用户界面...

    android微博系统,带服务端

    - **Android SDK**:项目基于Android SDK进行开发,这是Android应用的基础,提供了API接口,开发者可以调用这些接口来实现各种功能。 - **UI设计**:使用XML布局文件设计界面,包括登录/注册页面、主页面、发布...

    ShareList

    在ShareList中,这些技术用于读取、保存和传输用户上传的文件。 5. **网络编程**:如果ShareList支持网络分享,那么Socket编程和HTTP协议将扮演重要角色。Java的Socket类和HttpURLConnection类可以用来实现客户端-...

Global site tag (gtag.js) - Google Analytics