之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来。在这里我用两种例子让大家了解它的使用方法:

(1)上传图片及相应参数到服务器  (2)上传语音及相应参数到服务器。代码比较多。。。。

先贴上代码,再解析:

UploadFileTask .java : (实现异步上传的执行类)

<span style="font-size:14px;">public class UploadFileTask extends AsyncTask<String, Void, String>{
/**
* 可变长的输入参数,与AsyncTask.exucute()对应
*/
private ProgressDialog pdialog;
private Activity context=null;
public UploadFileTask(Activity ctx){
this.context=ctx;
pdialog=ProgressDialog.show(context, "正在加载...", "系统正在处理您的请求");
} @Override
protected void onPostExecute(String result) {
// 返回HTML页面的内容
pdialog.dismiss();
if(UploadUtils.taskSUCCESS.equals(result)){
Toast.makeText(context, "上传成功!",Toast.LENGTH_LONG ).show();
int size = Bimp.tempSelectBitmap.size();
while(size>0){
ImageItem imageItem = Bimp.tempSelectBitmap.get(size-1);
String imgPath = imageItem.getImagePath();
//从SD卡中删除图片
FileUtils.delFile(imgPath);
Bimp.tempSelectBitmap.remove(imageItem);
Bimp.max--;
//获取对应照片的音频数据
List<Voice> mDatas = StaticVariable.mapVoice.get(imgPath);
if(mDatas!=null){
int voiceNum = mDatas.size();
for(int j=0;j<voiceNum;j++){
String voicePath = mDatas.get(j).getFilePath();
//从SD卡中删除音频
FileUtils.delFile(voicePath);
StaticVariable.mapVoice.remove(imgPath);
}
}
size--;
}
FieldFragment.adapter.notifyDataSetChanged();
FieldFragment.imgRemark.setText(""); }else if(UploadUtils.terSUCCESS.equals(result)){
Toast.makeText(context, "上传成功!",Toast.LENGTH_LONG ).show();
int size = Bimp.terminalSelectBitmap.size();
while(size>0){
ImageItem imageItem = Bimp.terminalSelectBitmap.get(size-1);
if(imageItem.isCamera()){
//从SD卡中删除
FileUtils.delFile(imageItem.getImagePath());
}
Bimp.terminalSelectBitmap.remove(imageItem);
Bimp.terminalmax--;
size--;
}
UpdateTerminalFragment.terminalAdapter.notifyDataSetChanged(); }else{
Toast.makeText(context, "上传失败!",Toast.LENGTH_LONG ).show();
@Override
protected String doInBackground(String... params) {
String result = "";
//上传终端图片
if(params[0].equals(StaticVariable.TERMINAL_UPLOAD_IMG)){
//获取对应照片的文件
ArrayList<ImageItem> terBitmap = Bimp.terminalSelectBitmap;
File[] files = null;
if(terBitmap!=null){
int imgNum = terBitmap.size();
files = new File[imgNum];
for(int i=0;i<imgNum;i++){
String imgPath = terBitmap.get(i).getImagePath();
files[i] = new File(imgPath);
}
}
result = UploadUtils.uploadTerFile(files, StaticUrl.urlUploadTImgs);
}
//上传任务信息
else if(params[0].equals(StaticVariable.TASK_UPLOAD_IMG)){
//获取对应照片的文件
ArrayList<ImageItem> tempBitmap = Bimp.tempSelectBitmap;
for(int i=0;i<tempBitmap.size();i++){
String imgPath = tempBitmap.get(i).getImagePath();
//获取对应照片的音频数据
List<Voice> mDatas = StaticVariable.mapVoice.get(imgPath);
File[] voiceFiles = null;
if(mDatas!=null){
int voiceNum = mDatas.size();
voiceFiles = new File[voiceNum];
for(int j=0;j<voiceNum;j++){
String voicePath = mDatas.get(j).getFilePath();
voiceFiles[j] = new File(voicePath);
}
}
File file=new File(imgPath);
result = UploadUtils.uploadFile(file, voiceFiles, StaticUrl.urlAddImg);
}
}
return result;    }     @Override
    protected void onProgressUpdate(Void... values) {
    }
}
</span>

这个异步上传处理类是比较简单的:

在要上传的地方执行下面代码就会进入到异步处理类中进行相应的操作:

UploadFileTask uploadFileTask=new UploadFileTask(activity);
                    uploadFileTask.execute(StaticVariable.TASK_UPLOAD_IMG);

下面解析一下对上传类的操作:

result = UploadUtils.uploadFile(file, voiceFiles, StaticUrl.urlAddImg);

file:  这里是图片文件参数

voiceFiles:这个是语音文件,是一个文件数组

StaticUrl.urlAddImg: 文件上传的地址

resutl:返回结果

UploadUtils .java:

<span style="font-size:14px;">public class UploadUtils {
private static final int TIME_OUT = 10*10000000; //超时时间
private static final String CHARSET = "utf-8"; //设置编码
public static final String FAILURE="0"; //上传失败的返回结果
public static final String taskSUCCESS="1";<span style="white-space:pre"> </span> //上传成功的返回结果
public static final String terSUCCESS = "2"; //上传任务信息
public static String uploadFile(File file, File[] files, String RequestURL) {
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成(也可以自定义)
String PREFIX = "--" , LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; //内容类型(这是标准通用型,不过最好指明明确的文件类型)
try {
URL url = new URL(RequestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true); //允许输入流
conn.setDoOutput(true); //允许输出流
conn.setUseCaches(false); //不允许使用缓存
conn.setRequestMethod("POST"); //请求方式
conn.setRequestProperty("Charset", CHARSET); //设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
if(file!=null) {
/**
* 当文件不为空,把文件包装并且上传
*/
OutputStream outputSteam=conn.getOutputStream(); //获得网络传输的输出流 DataOutputStream dos = new DataOutputStream(outputSteam);
StringBuffer sb = new StringBuffer(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"uid\"" + LINE_END); //uid 作为上传参数的key(服务器端接收这个参数要对应这个key)
sb.append(LINE_END); sb.append(LoginActivity.uid + LINE_END); //LoginActivity.uid 是要上传参数的值 if(IScreateRecordHttp.hasSameRecord==0){
sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"hasSameRecord\""+LINE_END);
sb.append(LINE_END); sb.append(0+LINE_END); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"isid\""+LINE_END);
sb.append(LINE_END); sb.append(SeeTaskFragment.isid+LINE_END);
}else if(IScreateRecordHttp.hasSameRecord==1){
sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"hasSameRecord\""+LINE_END);
sb.append(LINE_END); sb.append(1+LINE_END); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"rid\""+LINE_END);
sb.append(LINE_END); sb.append(IScreateRecordHttp.rid+LINE_END);
} sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"remark\""+LINE_END);
sb.append(LINE_END); sb.append(FieldFragment.getRemark() + LINE_END); /**
* 这里重点注意:
* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png
*/
sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\""+file.getName()+"\""+LINE_END);
sb.append("Content-Type: image/jpeg"); //指明文件类型为图片jpeg类型
sb.append(LINE_END);sb.append(LINE_END); dos.write(sb.toString().getBytes()); InputStream is = new FileInputStream(file); //把图片文件转换成二进制流的方式 写入到dos中
byte[] bytes = new byte[1024];
int len = 0;
while((len=is.read(bytes))!=-1) {
dos.write(bytes, 0, len);
}
is.close();
dos.write(LINE_END.getBytes()); byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
dos.write(end_data);
dos.flush(); //释放流
/**
* 获取响应码 200=成功
* 当响应成功,获取响应的流
*/
int res = conn.getResponseCode();
Log.e("Mine", "response code:"+res);
if(res==200) { //这里是上传成功就继续上传音频文件,假如不需要就直接 return
InputStream isre = conn.getInputStream();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(isre,"gbk"));
String line = "";
StringBuffer sbre = new StringBuffer();
while ((line = buffer.readLine()) != null) {
sbre.append(line);
}
String result = sbre.toString(); //获取返回结果
Log.e("Mine",result); try{
JSONObject jsonObject = new JSONObject(result);
int iid = jsonObject.getInt("iid");
String type = jsonObject.getString("type");
String msg = jsonObject.getString("msg");
if(type.equals("SUCCESS")){
/*
在AsyncTask异步处理方法里面不可以再使用异步处理,
会导致UI(主)线程执行错误
<span style="white-space:pre"> </span>*/
uploadVoice(iid,files);
}
}catch(JSONException e){
e.printStackTrace();
}catch(ParseException e1){
e1.printStackTrace();
} return taskSUCCESS;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return FAILURE;
} //上传图片对应的语言
private static void uploadVoice(int iid,File[] files) {
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成
String PREFIX = "--" , LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; //内容类型 try{
String RequestURL = StaticUrl.urlAddVoices;
URL url = new URL(RequestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true); //允许输入流
conn.setDoOutput(true); //允许输出流
conn.setUseCaches(false); //不允许使用缓存
conn.setRequestMethod("POST"); //请求方式
conn.setRequestProperty("Charset", CHARSET); //设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
if(files!=null) {
/**
* 当文件不为空,把文件包装并且上传
*/
OutputStream outputSteam=conn.getOutputStream(); DataOutputStream dos = new DataOutputStream(outputSteam);
StringBuffer sb = new StringBuffer(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"uid\"" + LINE_END);
sb.append(LINE_END); sb.append(LoginActivity.uid + LINE_END); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"iid\""+LINE_END);
sb.append(LINE_END); sb.append(iid+LINE_END); dos.write(sb.toString().getBytes()); for(File file : files){ //多文件上传,用循环 StringBuffer sbImgs = new StringBuffer(); //这里面要注意:重新实例化一个StringBuffer,不然导致StringBuffer的重用,原来的参数也跟后来的参数一起传到服务器了。
// set 头部
sbImgs.append(PREFIX); sbImgs.append(BOUNDARY); sbImgs.append(LINE_END);
sbImgs.append("Content-Disposition: form-data; name=\"voices\"; filename=\""+file.getName()+"\""+LINE_END);
sbImgs.append("Content-Type: audio/mp3"+LINE_END);
sbImgs.append(LINE_END); // 1. write sb
dos.writeBytes(sbImgs.toString()); // 取得文件的FileInputStream
FileInputStream fis = new FileInputStream(file);
// 设置每次写入1024bytes
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize]; int length = -1;
// 从文件读取数据至缓冲区
while ((length = fis.read(buffer)) != -1) {
dos.write(buffer, 0, length);
}
dos.writeBytes(LINE_END);
fis.close(); dos.writeBytes(LINE_END);
dos.writeBytes(LINE_END);
} byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
dos.write(end_data);
dos.flush();
/**
* 获取响应码 200=成功
* 当响应成功,获取响应的流
*/
int res = conn.getResponseCode();
Log.e("Mine", "response code:"+res);
if(res==200) {
// return terSUCCESS;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// return FAILURE;
} //上传终端图片
public static String uploadTerFile(File[] files, String RequestURL) {
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成
String PREFIX = "--" , LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; //内容类型 try{
URL url = new URL(RequestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true); //允许输入流
conn.setDoOutput(true); //允许输出流
conn.setUseCaches(false); //不允许使用缓存
conn.setRequestMethod("POST"); //请求方式
conn.setRequestProperty("Charset", CHARSET); //设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
if(files!=null) {
/**
* 当文件不为空,把文件包装并且上传
*/
OutputStream outputSteam=conn.getOutputStream(); DataOutputStream dos = new DataOutputStream(outputSteam);
StringBuffer sb = new StringBuffer(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"uid\"" + LINE_END);
sb.append(LINE_END); sb.append(LoginActivity.uid + LINE_END); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"tid\""+LINE_END);
sb.append(LINE_END); sb.append(TerminalInfo.tid+LINE_END); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"remark\""+LINE_END);
sb.append(LINE_END); sb.append("备注" + LINE_END); dos.write(sb.toString().getBytes()); for(File file : files){ StringBuffer sbImgs = new StringBuffer();
// set 头部
sbImgs.append(PREFIX); sbImgs.append(BOUNDARY); sbImgs.append(LINE_END);
sbImgs.append("Content-Disposition: form-data; name=\"imgs\"; filename=\""+file.getName()+"\""+LINE_END);
sbImgs.append("Content-Type: image/jpeg"+LINE_END);
sbImgs.append(LINE_END); // 1. write sb
dos.writeBytes(sbImgs.toString()); // 取得文件的FileInputStream
FileInputStream fis = new FileInputStream(file);
// 设置每次写入1024bytes
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize]; int length = -1;
// 从文件读取数据至缓冲区
while ((length = fis.read(buffer)) != -1) {
dos.write(buffer, 0, length);
}
dos.writeBytes(LINE_END);
fis.close(); dos.writeBytes(LINE_END);
dos.writeBytes(LINE_END);
} byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
dos.write(end_data);
dos.flush();
/**
<span style="white-space:pre"> </span> * 获取响应码  200=成功
<span style="white-space:pre"> </span> * 当响应成功,获取响应的流
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>int res = conn.getResponseCode();
<span style="white-space:pre"> </span>Log.e("Mine", "response code:"+res);
<span style="white-space:pre"> </span>if(res==200) {
<span style="white-space:pre"> </span>return terSUCCESS;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>} catch (MalformedURLException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>} catch (IOException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return FAILURE;
<span style="white-space:pre"> </span>} }</span>

基本上掌握了这些方法,上传文件的操作就剩下套路了,以二进制流的方式上传文件要注意文件,参数它们的头,和尾,就是那些边界值。

好啦,大概就这些吧,下面推荐一下网络编程上传文件的文章:

http://blog.csdn.net/carterjin/article/details/7571915

http://blog.csdn.net/lmj623565791/article/details/23781773

关注公众号,分享干货,讨论技术

Android 网络编程--上传文件及相应的参数到服务器的更多相关文章

  1. php上传文件涉及到的参数

          php上传文件涉及到的参数: 几个参数调整: 0:文件上传时存放文件的临时目录.必须是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值 php.ini文件中uplo ...

  2. android使用webview上传文件(支持相册和拍照)

    老夫最近需要做一个项目,需要调用服务器段的一些网页来选择文件,刚开始还挺纠结的,不知从何下手,网上大致预览了大神们走过的路,他们传统的方式都是使用一下代码: public void openFileC ...

  3. java_网络编程之上传文件案例

    初期成果: 客户端: package FileUpload; import java.io.*; import java.net.Socket; import java.util.Scanner; p ...

  4. FormData上传文件同时附带其他参数

    前端js代码: function fileSubmit() { var formData = new FormData(); formData.append(].files[]); var type ...

  5. 上传文件表单file,限制上传文件类型的方法--参数accept

    我们使用<input type="file" />来上传文件,但是当你只想要上传某种格式的文件,比如说(jpg)文件时.可以通过accept来限制. <form& ...

  6. C#使用HttpClient上传文件并附带其他参数

    HttpClient和MultipartFormDataContent(传送门)最低适用于.NET Framework 4.5版本 发送端代码 using (HttpClient client = n ...

  7. 「NetworkOnMainThreadException」:Android 2.3到Android 4.0上传文件的问题

    我在百度知道上的提问: 『之前我用的一段文件上传的代码,配合服务器端的servlet,实现了上传手机上的文件的功能:但是后来我把手机的Android系统从2.3升级到了4.0 ,同样的代码,同样的配置 ...

  8. 关于Android使用SFTP上传文件报错问题

    错误报告java.lang.NoClassDefFoundError:Failed resolution of: Lorg/ietf/jgss/Oid; 问题是由于 Lorg.ietf. jgss.O ...

  9. Python3-paramiko-SFTP上传文件夹到多台远程服务器

    # coding: utf-8 import paramiko import re import os from time import sleep # 定义一个类,表示一台远端linux主机 # 参 ...

随机推荐

  1. Sqoop的安装配置及使用

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  2. 长沙Uber优步司机奖励政策(3月28日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 第四模块:网络编程进阶&数据库开发 考核实战

     1.什么是进程?什么是线程? 什么是协程? 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 线程:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 协程是一种用 ...

  4. 8.Mongodb备份与恢复

    1.备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目 ...

  5. sqoop 的使用 -20160410

    1  导入导出数据库   1)列出mysql数据库中的所有数据库命令  #  sqoop list-databases --connect jdbc:mysql://localhost:3306/ - ...

  6. ReentrantLock类的hasQueuedPredecessors方法和head节点的含义

    部分启发来源自文章:Java并发编程--Lock PART 1 1.如果h==t成立,h和t均为null或是同一个具体的节点,无后继节点,返回false.2.如果h!=t成立,head.next是否为 ...

  7. 根据STATUS信息对MySQL进行优化

    mysql> show global status;可以列出MySQL服务器运行各种状态值,我个人较喜欢的用法是show status like '查询值%';一.慢查询mysql> sh ...

  8. js学习日记-隐式转换相关的坑及知识

    隐式转换比较是js中绕不过去的坎,就算有几年经验的工程师也很有可能对这块知识不够熟悉.就算你知道使用===比较从而避免踩坑,但是团队其它成员不一定知道有这样或那样的坑,有后端语言经验的人常常会形成一个 ...

  9. 《python核心编程第二版》第2章习题

    2-1 略 2-1 略 2-2 (a)打印 结果是9 (b)9 (c)一样 (d)略 (e)略 2-3 略 2-4 (a) # /usr/bin/pythonraw_input() (b) # /us ...

  10. Linux---CentOS 定时执行脚本配置

    非常多时候我们有希望server定时去运行一个脚本来触发一个操作.比方使用七牛的工具上传,假设同步文件中面有新添加一个文件,这个时候我们能够提供定时脚本去完毕我们须要的同步命令(七牛的qrsbox工具 ...