通过Http协议实现文件上传

http上传文件 http协议是建立在tcp、ip协议的应用层规范。 http协议规范把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现都是围绕 “如何运用和组织这三部分” 来完成的。了解http请求的组成部分后,就可以应变任何实际工作中所遇到的需求和问题了。 http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。 Content-Type在发送到服务器时候内容编码方式,它有如下的三个值。 ①application/x-www-form-urlen... 阅读详情

原文链接:http://blog.youkuaiyun.com/sabic/article/details/6568386


先创建一个测试的JavaBean,定义需要的属性,并生成相应的Set和Get方法。该JavaBean还包含两个构造方法

具体使用请注意阅读注释

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
/**
 * 上传文件
 * FormFile 该JavaBean用来封装上传文件的数据
 */
public class FormFile {
	/* 上传文件的数据 */
	private byte[] data;
	private InputStream inStream;
	private File file;
	/* 文件名称 */
	private String filname;
	/* 请求参数名称*/
	private String parameterName;
	/* 内容类型 */
	private String contentType = "application/octet-stream";
	
	/*
	下面是两个构造函数,主要用于大小不同的文件的上传
	*/
	//该构造器适用于文件小于1M,把数据全部转换为二进制,放到手机内存
	public FormFile(String filname, byte[] data, String parameterName, String contentType) {
		this.data = data;
		this.filname = filname;
		this.parameterName = parameterName;
		if(contentType!=null) this.contentType = contentType;
	}
	
	//大文件用输入、输出流进行边读取边上传
	public FormFile(String filname, File file, String parameterName, String contentType) {
		this.filname = filname;
		this.parameterName = parameterName;
		this.file = file;
		try {
			this.inStream = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		if(contentType!=null) this.contentType = contentType;
	}
	
	public File getFile() {
		return file;
	}
	public InputStream getInStream() {
		return inStream;
	}
	public byte[] getData() {
		return data;
	}
	public String getFilname() {
		return filname;
	}
	public void setFilname(String filname) {
		this.filname = filname;
	}
	public String getParameterName() {
		return parameterName;
	}
	public void setParameterName(String parameterName) {
		this.parameterName = parameterName;
	}
	public String getContentType() {
		return contentType;
	}
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	
}


下面这个类,是利用Http协议上传的工具类


import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
	/**
	 * 通过Http协议上传文件,适用于2M大小以内的文件,如果是视频等大文件应采用其他方法
	 * 如果上传文本内容,可直接使用Post提交,该类主要是用于上传小文件
	 */
public class SocketHttpRequester {
	/**
	 * 发送xml数据
	 * @param path 请求地址
	 * @param xml xml数据
	 * @param encoding 编码
	 * @return
	 * @throws Exception
	 */
	public static byte[] postXml(String path, String xml, String encoding) throws Exception{
		byte[] data = xml.getBytes(encoding);
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
		conn.setRequestMethod("POST");
		conn.setDoOutput(true);
		conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding);
		conn.setRequestProperty("Content-Length", String.valueOf(data.length));
		conn.setConnectTimeout(5 * 1000);
		OutputStream outStream = conn.getOutputStream();
		outStream.write(data);
		outStream.flush();
		outStream.close();
		if(conn.getResponseCode()==200){
			return readStream(conn.getInputStream());
		}
		return null;
	}
	
	/**
	 * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
	 *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">
			<INPUT TYPE="text" NAME="name">
			<INPUT TYPE="text" NAME="id">
			<input type="file" name="imagefile"/>
		    <input type="file" name="zip"/>
		 </FORM>
	 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
	 * @param params 请求参数 key为参数名,value为参数值
	 * @param file 上传文件
	 */
	public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{     
        final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
        final String endline = "--" + BOUNDARY + "--/r/n";//数据结束标志
        
        int fileDataLength = 0;
        for(FormFile uploadFile : files){//得到文件类型数据的总长度
        	StringBuilder fileExplain = new StringBuilder();
 	        fileExplain.append("--");
 	        fileExplain.append(BOUNDARY);
 	        fileExplain.append("/r/n");
 	        fileExplain.append("Content-Disposition: form-data;name=/""+ uploadFile.getParameterName()+"/";filename=/""+ uploadFile.getFilname() + "/"/r/n");
 	        fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"/r/n/r/n");
 	        fileExplain.append("/r/n");
 	        fileDataLength += fileExplain.length();
        	if(uploadFile.getInStream()!=null){
        		fileDataLength += uploadFile.getFile().length();
	 	    }else{
	 	    	fileDataLength += uploadFile.getData().length;
	 	    }
        }
        StringBuilder textEntity = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
            textEntity.append("--");
            textEntity.append(BOUNDARY);
            textEntity.append("/r/n");
            textEntity.append("Content-Disposition: form-data; name=/""+ entry.getKey() + "/"/r/n/r/n");
            textEntity.append(entry.getValue());
            textEntity.append("/r/n");
        }
        //计算传输给服务器的实体数据总长度 endline(最后的结束线)
        int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;
        
        URL url = new URL(path);
		//得到端口号,如果是-1 就用80,否则取得端口号
        int port = url.getPort()==-1 ? 80 : url.getPort();
		//创建一个Socket,链接到服务器的某一个端口,如80端口
        Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);	 
		//数据由Android应用传到服务器,所以构建输出流
        OutputStream outStream = socket.getOutputStream();
        //下面完成HTTP请求头的发送
        String requestmethod = "POST "+ url.getPath()+" HTTP/1.1/r/n";
        outStream.write(requestmethod.getBytes());
		//完成第二个协议头的数据,可省略
        String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*/r/n";
        outStream.write(accept.getBytes());
        String language = "Accept-Language: zh-CN/r/n";
        outStream.write(language.getBytes());
        String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "/r/n";
        outStream.write(contenttype.getBytes());
		//内容的长度
        String contentlength = "Content-Length: "+ dataLength + "/r/n";
        outStream.write(contentlength.getBytes());
		//Connection请求头
        String alive = "Connection: Keep-Alive/r/n";
        outStream.write(alive.getBytes());
		//Host请求头,末尾"/r/n" 是回车换行符
        String host = "Host: "+ url.getHost() +":"+ port +"/r/n";
        outStream.write(host.getBytes());
        //写完HTTP请求头后根据HTTP协议再写一个回车换行
        outStream.write("/r/n".getBytes());
        //把所有"文本"类型的实体数据发送出来
        outStream.write(textEntity.toString().getBytes());	       
        //把所有"文件"类型的实体数据发送出来
        for(FormFile uploadFile : files){
        	StringBuilder fileEntity = new StringBuilder();
			//分割线前面多了两个--符号,加进来,都是从http协议参考过来的
 	        fileEntity.append("--");
 	        fileEntity.append(BOUNDARY);
			//回车换行符
 	        fileEntity.append("/r/n");
 	        fileEntity.append("Content-Disposition: form-data;name=/""+ uploadFile.getParameterName()+"/";filename=/""+ uploadFile.getFilname() + "/"/r/n");
 	        fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"/r/n/r/n");
 	        outStream.write(fileEntity.toString().getBytes());
			//先判断文件有没有输入流,以便确定调用哪个构造方法(该JavaBean里有两个构造方法)
 	        if(uploadFile.getInStream()!=null){
 	        	byte[] buffer = new byte[1024];
 	        	int len = 0;
 	        	while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
 	        		outStream.write(buffer, 0, len);
 	        	}
 	        	uploadFile.getInStream().close();
 	        }else{
				//否则代表是以二进制数据传进来的,调用下面的处理方法
 	        	outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
 	        }
 	        outStream.write("/r/n".getBytes());
        }
        //下面发送数据结束标志,表示数据已经结束,此时服务器会给客户端返回一个响应信息
        outStream.write(endline.getBytes());
        //从服务端读取响应状态,所以是InputStream
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//返回的信息,第一行就包含状态
        if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
        	return false;
        }
        outStream.flush();
        outStream.close();
        reader.close();
        socket.close();
        return true;
	}
	
	/**
	 * 提交数据到服务器
	 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
	 * @param params 请求参数 key为参数名,value为参数值
	 * @param file 上传文件
	 */
	public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{
	   return post(path, params, new FormFile[]{file});
	}
	/**
	 * 提交数据到服务器
	 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
	 * @param params 请求参数 key为参数名,value为参数值
	 * @param encode 编码
	 */
	public static byte[] postFromHttpClient(String path, Map<String, String> params, String encode) throws Exception{
		List<NameValuePair> formparams = new ArrayList<NameValuePair>();//用于存放请求参数
		for(Map.Entry<String, String> entry : params.entrySet()){
			formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
		}
		UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, encode);
		HttpPost httppost = new HttpPost(path);
		httppost.setEntity(entity);
		HttpClient httpclient = new DefaultHttpClient();//看作是浏览器
		HttpResponse response = httpclient.execute(httppost);//发送post请求		
		return readStream(response.getEntity().getContent());
	}
	/**
	 * 发送请求
	 * @param path 请求路径
	 * @param params 请求参数 key为参数名称 value为参数值
	 * @param encode 请求参数的编码
	 */
	public static byte[] post(String path, Map<String, String> params, String encode) throws Exception{
		//String params = "method=save&name="+ URLEncoder.encode("老毕", "UTF-8")+ "&age=28&";//需要发送的参数
		StringBuilder parambuilder = new StringBuilder("");
		if(params!=null && !params.isEmpty()){
			for(Map.Entry<String, String> entry : params.entrySet()){
				parambuilder.append(entry.getKey()).append("=")
					.append(URLEncoder.encode(entry.getValue(), encode)).append("&");
			}
			parambuilder.deleteCharAt(parambuilder.length()-1);
		}
		byte[] data = parambuilder.toString().getBytes();
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
		conn.setDoOutput(true);//允许对外发送请求参数
		conn.setUseCaches(false);//不进行缓存
		conn.setConnectTimeout(5 * 1000);
		conn.setRequestMethod("POST");
		//下面设置http请求头
		conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
		conn.setRequestProperty("Accept-Language", "zh-CN");
		conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		conn.setRequestProperty("Content-Length", String.valueOf(data.length));
		conn.setRequestProperty("Connection", "Keep-Alive");
		
		//发送参数
		DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
		outStream.write(data);//把参数发送出去
		outStream.flush();
		outStream.close();
		if(conn.getResponseCode()==200){
			return readStream(conn.getInputStream());
		}
		return null;
	}
	
	/**
	 * 读取流
	 * @param inStream
	 * @return 字节数组
	 * @throws Exception
	 */
	public static byte[] readStream(InputStream inStream) throws Exception{
		ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		while( (len=inStream.read(buffer)) != -1){
			outSteam.write(buffer, 0, len);
		}
		outSteam.close();
		inStream.close();
		return outSteam.toByteArray();
	}
}

调用时可以这样写,仅供参考,这里是通过触发一个Button事件调用:


button.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View v) {
				String title = titleText.getText().toString();
				String timelength = timelengthText.getText().toString();
				//通过Map构造器传参
				Map<String, String> params = new HashMap<String, String>();
				params.put("method", "save");
				params.put("title", title);
				params.put("timelength", timelength);
				try {
					//取得上传文件的名称
					File uploadFile = new File(Environment.getExternalStorageDirectory(), videoText.getText().toString());
					//文件上传JavaBean ,通过New调用构造方法(此处是调用第二个构造函数,以输入、输出流上传),audio/mpeg为Mp3文件的内容类型
					//如果不知道上传文件的内容类型,可以在IE浏览器上传一个文件测试,在后台观察源码(通过HttpWatch)
					FormFile formfile = new FormFile("02.mp3", uploadFile, "video", "audio/mpeg");
					SocketHttpRequester.post("http://192.168.1.100:8080/videoweb/video/manage.do", params, formfile);
					Toast.makeText(MainActivity.this, R.string.success, 1).show();
				} catch (Exception e) {
					Toast.makeText(MainActivity.this, R.string.error, 1).show();
					Log.e(TAG, e.toString());
				}
			}
		});





采用数据流的方式来上传文件,HttpUtils样例 背景 开发过程中,总会遇见你从来没有尝试过的技术或者是已有技术的使用,更可能是你在用的技术的变种使用。工作还是要完成的,但是这些东西我们又不知道如何使用,那么就只有“速学”了,拥有一个良好的学习,探索习惯是我们每个人成长的必要充分条件!接下来,就让我们来看看如何使用采用数据流的方式通过代码来上传文件吧! 基于数据流方式上传的httpUtils样例 这里采用gradle来构建项目,如果你使用maven构建项目,找到响应的GAV信息添加到项目的pom.xml文件即可。(这里不得不说一下,gradle真的好用,很 阅读详情

相关推荐

OkHttpUtils 下载上传文件

android 下载和上传 文件

minusn的博客 2366

HTTP协议下实现上传文件

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://luecsc.blog.51cto.com/2219432/1113654          一、HTTP协议基础         1、HTTP协议概念          协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议

zxsted的专栏 1859

Java实现HTTP协议的文件上传完全指南

HTTP文件上传是网络应用中常见的功能,它允许用户通过浏览器将文件发送到服务器。这一过程主要通过编码类型来实现,以便在HTTP协议中封装表单数据和文件数据。Spring MVC是Spring框架的一个模块,它遵循MVC(Model-View-Controller)设计模式,专门用于构建Web应用程序。Spring MVC提供了丰富的组件来帮助开发者实现Web层的业务逻辑,并且简化了文件上传的处理过程。它内置了对的处理支持,并提供了一个接口,使得文件上传变得简单直接。Apache。

weixin_28949937的博客 1476

使用HttpUtil上传文件

通过HttpUtil上传文件

大家好,我是云村的王子 4494

spring-ai学习(四)-MCP

创建一个springai项目1.依赖。

zql1455890112的博客 1383

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

Android下的应用编程——用HTTP协议实现文件上传功能

 【文章标题】Android下的应用编程——用HTTP协议实现文件上传功能【文章作者】曾健生【作者邮箱】zengjiansheng1@126.com【作者QQ】190678908【作者MSN】zengjiansheng1@hotmail.com【作者博客】blog.youkuaiyun.com/newjueqi  ******************************

曾健生的专栏 1万+

Vscode+ROS/ROS2 开发调试基于ROS/ROS2应用环境配置

在ROS操作系统开发应用程序时,我们常常需要调试代码,验证程序的正确性。但是在用rosrun或者roslaunch启动节点后,若程序运行过程中发生错误而导致发生出错停止工作,这时候终端并不会输出具体的信息指出在何处发生了错误,具体错误的原因又是什么。往往仅仅是core dump 或者segmentation fault 等等一类的模糊提示。

Chasinglight的博客 5800

使用WinHttp接口实现HTTP协议Get、Post和文件上传功能

我实现了一个最新版本的接口,详见《实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现》。还有基于libcurl实现的版本《实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现》。以下是原博文: 我们在做项目开发时,往往会涉及到和服务器通信。对于安全性要求不高的情况,一般我们采用HTTP通信协议。对于喜欢挑战底层技术...

方亮的专栏 6万+

C#计算八字

private string[] jq = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };

m0_72939038的博客 827

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5768

实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

在《使用WinHttp接口实现HTTP协议Get、Post和文件上传功能》一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议。在最近的代码梳理中,我觉得Post和文件上传模块可以得到简化,于是几乎重写了这两个功能的代码。因为Get、Post和文件上传功能的基础(父)类基本没有改动,函数调用的流程也基本没有变化,所以本文我将重点讲解修改点。(转载请指明出于break...

方亮的专栏 2万+

uniapp - [微信小程序 | 安卓苹果app] 详细实现接入天地图完整流程,提供显示地图、IP 属地定位 / 用户定位的城市名称、用户定位的经纬度超多功能(复制运行示例代码,详细注释及常见问题)

uni-app,微信小程序,安卓app,苹果app,App端,支付宝小程序,nvue,天地图,国家天地图api,接入使用天地图,uniApp小程序端接入天地图,uniapp安卓苹果app端接入天地图,微信小程序平台如何引入天地图,天地图Api使用教程,如何在uniapp里集成天地图,使用天地图获取当前定位,天地图api教程,天地图官方文档,天地图详细使用教程,Uniapp项目如何使用天地图,项目引入天地图配置及使用教程,使用天地图获取用户定位,天地图获取用户当前位置信息(经纬度),如何通过天地图拿到用户定位

🏆 前端领域优质创作者 1万+

HTTP协议下C#文件上传下载功能的实现策略?

要求:免费,开源,技术支持功能:大文件上传下载,断点续传,文件夹上传下载,加密传输,加密存储,云对象存储前端:vue2,vue3,vue.js,vue-cli,react,html,jquery后端:asp.net,vb.net,.net core,.net mvc,.net webform平台:Windows,macOS,Linux,Ubuntu,RedHat,CentOS,中标麒麟,银河麒麟,统信UOS,信创国产化。

weixin_45525177的博客 1125

让旧 Append 字段升级为真正的 Key User Custom Field:基于 SCFD_EUI 的无损转换与 UI / API 暴露实战

摘要:SAP S/4HANA私有云和本地部署项目中,常面临将历史遗留的手工追加字段转换为可管理的Custom Field的挑战。SAP提供通过事务码SCFD_EUI将旧字段转换为ABAP Managed Field(AMF)的路径,实现字段名和数据原地保留的同时获得扩展能力。适用场景包括已沉淀多年数据的字段迁移成本高,或对数据元素有特殊约束需求。转换后字段可在Fiori UI、报表、表单等多触点统一管理。但AMF会增加复杂度,建议优先使用标准Custom Field。操作前需确保开发环境和传输配置正确,并遵

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 247

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3402

通过解析HTTP协议自己实现文件上传

 JSP代码 两个文本输入框,两个上传文件,使用POST提交,这时通过HTTP协议发送的请求是什么样的呢?通过HTTP协议分析其可以看到请求行POST /myupload/uploadDo HTTP/1.1请求头Host: localhost:8820User-Agent: Mozil

chiphuo的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android之使用Http协议实现文件上传功能

注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java public class MainActivity extends Activity    {       private static final String TAG = "MainActivity";

翊轩LeOn 2996

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[Android开发]Android之使用Http协议实现文件上传功能

注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java view plain public class MainActivity

pfgmylove的专栏 2273
上一篇: window下cocos2dx环境配置及打包apk
下一篇: TortoiseGit设置代理问题
zzstack
博客等级 码龄15年 12粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值