Android上传图片到服务器,服务端利用.NET WCFRest服务读取文件的解决方案
在项目中遇到要将Android设备拍摄的照片上传的服务器,将文件保存在服务器本地的文件夹中,数据库中保存的是图片文件名。整个上传是将图片生成二进制流通过HTTP请求上传到服务端,服务端是基于.NET环境的,采用ashx一般处理程序处理服务返回结果。
下面直接贴上代码,先是上传文件HTTP请求的静态方法:
/**
* 通过上传文件流形式上传文件
* @param picPaths
* @param requestURL
* @return
*/
public static String uploadFile(String[] picPaths, String requestURL) {
String boundary = UUID.randomUUID().toString();
String prefix = "--", end = "\r\n";
String content_type = "multipart/form-data"; // 内容类型
String CHARSET = "utf-8"; // 设置编码
int TIME_OUT = 10 * 10000000; // 超时时间
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", "utf-8"); // 设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", content_type + ";boundary=" + boundary);
//当文件不为空,把文件包装并且上传
OutputStream outputSteam = conn.getOutputStream();
DataOutputStream dos = new DataOutputStream(outputSteam); StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(prefix);
stringBuffer.append(boundary);
stringBuffer.append(end);
dos.write(stringBuffer.toString().getBytes()); dos.writeBytes("Content-Disposition: form-data; name=\"" + author + "\"" + end);
dos.writeBytes(end);
dos.writeBytes("klose");
dos.writeBytes(end); for(int i = 0; i < picPaths.length; i++){
File file = new File(picPaths[i]);
StringBuffer sb = new StringBuffer();
sb.append(prefix);
sb.append(boundary);
sb.append(end);
sb.append("Content-Disposition: form-data; name=\"" + i + "\"; filename=\"" + file.getName() + end);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + end);
sb.append(end);
dos.write(sb.toString().getBytes()); InputStream is = new FileInputStream(file);
byte[] bytes = new byte[8192];//8k
int len = 0;
while ((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
}
is.close();
dos.write(end.getBytes());//一个文件结束标志
}
byte[] end_data = (prefix + boundary + prefix + end).getBytes();//结束 http 流
dos.write(end_data);
dos.flush(); //获取响应状态
int responseCode = conn.getResponseCode(); if (HttpURLConnection.HTTP_OK == responseCode) { //连接成功
//当正确响应时处理数据
StringBuffer buffer = new StringBuffer();
String readLine;
BufferedReader responseReader;
//处理响应流
responseReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((readLine = responseReader.readLine()) != null) {
buffer.append(readLine).append("\n");
}
responseReader.close();
Log.d("HttpPOST", buffer.toString());
return "保存成功!";//成功
}
}catch (Exception e) {
e.printStackTrace();
}
return "保存失败!";
}
二进制流报文格式如下所示:
--b8690cde-dc7b-48cb-868a-f328b6355a3c
Content-Disposition: form-data; name="author" xxx
--b8690cde-dc7b-48cb-868a-f328b6355a3c
Content-Disposition: form-data; name=""; filename="xxxx.jpg"
Content-Type: application/octet-stream; charset=utf- (这里是二进制数据)
--b8690cde-dc7b-48cb-868a-f328b6355a3c--
在.NET服务端接受二进制流的ashx程序代码如下所示:
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{
string rootPath = ConfigurationManager.AppSettings["FileDirectory"];
private IRepository _repository = new RepositoryImpl(); public void ProcessRequest(HttpContext context)
{ var request = context.Request;
returnUploadResult(request); } public string returnUploadResult(HttpRequest request)
{
var files = request.Files;
var formUpload = request.Files.Count > ; string resultStr = ""; if (formUpload)
{ for (int i = ; i < request.Files.Count; i++)
{
var formFilename = formUpload ? request.Files[i].FileName : null;
var upload = new FineUpload
{
Filename = formFilename,
InputStream = formUpload ? request.Files[i].InputStream : request.InputStream
};
string fileName = upload.Filename;
string fullFileName = Path.Combine(rootPath, fileName); if (System.IO.File.Exists(fullFileName))
{
XSBPHOTOURL template = new XSBPHOTOURL();
template.NAME = fileName.ToString();
template.IMGGUID = Guid.NewGuid().ToString();
_repository.Save<XSBPHOTOURL>(template);
resultStr += (fullFileName + "已存在。 ");
}
else
{
XSBPHOTOURL template = new XSBPHOTOURL();
template.NAME = fileName.ToString();
template.IMGGUID = Guid.NewGuid().ToString();
_repository.Save<XSBPHOTOURL>(template);
upload.SaveAs(fullFileName);
resultStr += (fullFileName + "保存成功。 ");
}
}
}
return resultStr; } public bool IsReusable
{
get
{
return false;
}
}
}
服务端文件保存路径写在WebConfig中,在appSettings中添加一行代码就可以了,示例如下:
<appSettings>
<add key="FileDirectory" value="D:/UploadFiles"/>
</appSettings>
这样就从Android客户端完成了文件上传功能,欢迎各位批评指正!
Android上传图片到服务器,服务端利用.NET WCFRest服务读取文件的解决方案的更多相关文章
- atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系
atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系 1. 服务器控件是可被服务器理解的标签.有三种类型的服务器控件: 1 1.1. HTML 服务器控件 ...
- day112:MoFang:种植园使用websocket代替http&服务端基于flask-socketio提供服务&服务端响应信息&种植园页面显示初始化
目录 1.种植园使用websocket代替http 2.服务端基于socket提供服务 3.服务端响应信息 4.种植园页面展示 1.种植园使用websocket代替http 我们需要完成的种植园,是一 ...
- 服务端使用Zookeeper注册服务地址,客户端从Zookeeper获取可用的服务地址。
一个轻量级分布式RPC框架--NettyRpc - 阿凡卢 - 博客园 http://www.cnblogs.com/luxiaoxun/p/5272384.html 这个RPC框架使用的一些技术所解 ...
- Android 上传图片到服务器 okhttp一
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...
- Android 上传图片到服务器二--------调用相机7.0以上权限问题
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...
- mpush 服务端配置 for windows 服务自动运行
mpush 服务端配置 以下安装部分是参照官方的步骤, 一.安装jdk1.8并配置环境变量 示例: http://www.cnblogs.com/endv/p/6439860.html 二.Wind ...
- oracle服务端与客户端字符集不同导致中文乱码解决方案
1.问题描述 用pl/sql登录时,会提示“数据库字符集(ZHS16GBK)和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果”,具体问题是中文乱码,如下图 2.问题分析 不管错误信息 ...
- MVC文件上传05-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义上传文件夹
在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 MVC文 ...
- java Socket Tcp示例三则(服务端处理数据、上传文件)
示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...
随机推荐
- JavaScript实现淡入淡出
<!DOCTYPE html> <html> <head> <title>css动画</title> </head> <b ...
- Windows10中“SQL Server 配置管理器”哪去了?
SQL Server 配置管理器是一种工具,用于管理与 SQL Server 相关联的服务.配置 SQL Server 使用的网络协议以及从 SQL Server 客户端计算机管理网络连接配置.SQL ...
- java宠物练习
先定一个宠物的抽象类,把所有共有的属性方法放到次类中,用于子类去继承实现. package backing2; abstract public class pet { private String n ...
- Android - TabHost 与 Fragment 制作页面切换效果
Android - TabHost 与 Fragment 制作页面切换效果 Android API 19 , API 23 三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义 ...
- Vue.js之深入浅出
介绍引言 Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上 ...
- hdu_1711: Number Sequence【KMP算法】
题目链接 此次插播点笔记 hdu中点击蓝色的"Compilation Error"可以查看自己是为什么CE的 hdu中提交的话,语言选择G++可以使用<bits/stdc++ ...
- [bzoj 1468][poj 1741]Tree [点分治]
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...
- laravel 事件监听
事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制 操作顺序:1.注册事件和监听器 -> 2.定义事件类 -> 3.定义监听类 -> 4.触发事 ...
- 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA
本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...
- Maven在导入其他项目时报错:Plugin execution not covered by lifecycle configuration
这几天想把Spring 攻略第二版完整的学习下,所以就在网上下载了该教材的源码,寻思边看书边练习!之前有过一些Maven开发的相关经验,觉得Maven在引入jar包上的配置还是很方便的,所以这次源码的 ...