今天的任务是让android往web服务器发送文件,测试的时候,从字符串开始测起,然后是发送txt文件,最后是发送图片;测试字符串以及带中文的txt时,遇见了中文乱码的情况,浏览了很多大神发布到博客上的分享,感觉自己学到了不少,在这里不一一列出。
好的,重点来了,这一次想要分享我今天实验的最终结果:可以传送txt、图片、压缩包的客户端以及服务端代码:
先看运行结果:
图1.发送前
图2 手机端的文件目录
发送后:
图3 电脑端已经接收到pcs.rar
对比两份文件的属性:
图4 电脑端的压缩包文件属性
图5.手机端压缩包的文件属性
打开服务端接收到的文件夹,看看是否出现乱码:
效果展示完了,现在说一下心得,就一句话:二进制真的很神奇,这一次传送文件,完全没怎么考虑编码解码的事情,不过有点遗憾的是:用HTTP来收发文件会有限制,不能
发送太大的文件,不然会超时,服务器会报警~~
最后一个环节,上代码:
android端:
public void mtest(){
//构建URL的格式为: http://IP地址:监听的端口号/Servlet的路径
final String strUrl = "http://175.0.154.126:8080/uploadimageServlet";
//文件路径+文件名 [此处最好是把文件格式给带上]
final String filepath = "/mnt/sdcard2/zmaee/pcs.rar";
final URL[] url = {null};
Thread th=new Thread(new Runnable() {
@Override
public void run() {
try{
String content = null;
try {
content = "?command=" + URLEncoder.encode("upload image", "UTF-8")+"&filename="+ URLEncoder.encode("pcs.rar", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//第一步:访问网站,进行连接
url[0] =new URL(strUrl+content);
HttpURLConnection urlConn=(HttpURLConnection) url[0].openConnection();
urlConn.setDoInput(true); //setting inputstream using bytestream
urlConn.setDoOutput(true);
urlConn.setRequestMethod("POST");
urlConn.setUseCaches(false);
urlConn.setRequestProperty("Content-Type","application/x-ww-form-urlencoded"); //
urlConn.setRequestProperty("Charset","utf-8");
urlConn.connect();
//第二步:打开数据通道
DataOutputStream dop=new DataOutputStream(urlConn.getOutputStream());
//第三步:准备好发送的数据
File f=new File(filepath);
FileInputStream fis=new FileInputStream(f);
if(f.isFile()){
byte[] buffer=new byte[1024];
int length=0;
while ((length=fis.read(buffer))!=-1){
dop.write(buffer,0,length);
}
}else { //如果不是文件,直接返回,然后啥也不干
return;
}
//第四步:将准备的数据发送给服务器
dop.flush();
dop.close();
//第五步:打开输入的数据通道,等待服务端回发数据!
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String result="";
String readLine=null;
while ((readLine=bufferedReader.readLine())!=null){
result+=readLine;
}
//最后一步:清理场地,主要是把打开的通道都关闭掉,养成一个好习惯
bufferedReader.close();
urlConn.disconnect();
//调试返回的数据
System.out.println("从服务端获得的返回数据为: "+ URLDecoder.decode(result,"utf-8"));
}catch (MalformedURLException e){
System.out.println("出现了异常:"+e.getMessage());
} catch (IOException e) {
System.out.println("出现了异常:"+e.getMessage());
e.printStackTrace();
}
}
});
th.start();
}
服务端:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String command_str=URLDecoder.decode(new String(request.getParameter("command").getBytes(),"utf-8"));
String filename_str=new String(request.getParameter("filename").getBytes("iso8859-1"),"utf-8");
String fullFileName=filename_str;
System.out.println("从客户端收到的消息为:\n命令 :"+command_str+"\n文件名:"+filename_str);
String path="G:/niki/upload/";//构建上传路径
response.setCharacterEncoding("utf-8");
FileWriter fw=new FileWriter(path+"\\"+filename_str,true);
File f=new File(path+"\\"+filename_str);
if(!f.exists()){
f.createNewFile();
}
FileOutputStream fos=new FileOutputStream(f);
byte[] buffer=new byte[1024];
InputStream inputStream=request.getInputStream();
int length;
byte[] temp=new byte[1024];
PrintWriter printWriter=response.getWriter();
int count=0;
while ((length=inputStream.read(buffer))!=-1){
// fw.write(URLDecoder.decode(new String(buffer,2,length-2).replace("%","%25"),"UTF-8"));//部分中文没有被翻译正确
// temp= new Base64.Decoder(buffer);
fos.write(buffer,0,length);
// fw.write(URLDecoder.decode(new String(buffer,2,length-2).replace("%","%25"),"iso8859-1"));
count+=length;
System.out.println("现在的保存进度为:"+count);
}
fos.close();
fw.close();
printWriter.write("服务器已经收到文件了");
}
分享结束,如果这两段代码,读者还有其他疑问,欢迎留言~
谢谢大家的阅读