接上一篇文章《Android上传文件到Web服务器,PHP接收文件(一)》,这次在之前的基础上添加进度显示,Java代码如下所示:

[java]view plaincopy
  1. packagecom.lenovo.uptest;
  2. importjava.io.DataInputStream;
  3. importjava.io.DataOutputStream;
  4. importjava.io.File;
  5. importjava.io.FileInputStream;
  6. importjava.net.HttpURLConnection;
  7. importjava.net.URL;
  8. importandroid.app.Activity;
  9. importandroid.app.AlertDialog;
  10. importandroid.app.ProgressDialog;
  11. importandroid.content.DialogInterface;
  12. importandroid.os.AsyncTask;
  13. importandroid.os.Bundle;
  14. importandroid.view.View;
  15. importandroid.widget.Button;
  16. importandroid.widget.TextView;
  17. publicclassUploadtestActivityextendsActivity{
  18. /**Calledwhentheactivityisfirstcreated.*/
  19. /**
  20. *Uploadfiletowebserverwithprogressstatus,client:android;
  21. *server:php
  22. ***/
  23. privateTextViewmtv1=null;
  24. privateTextViewmtv2=null;
  25. privateButtonbupload=null;
  26. privateStringuploadFile="/sdcard/testimg.jpg";
  27. privateStringactionUrl="http://10.100.1.208/receive_file.php";
  28. @Override
  29. publicvoidonCreate(BundlesavedInstanceState){
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.main);
  32. mtv1=(TextView)findViewById(R.id.mtv1);
  33. mtv1.setText("文件路径:\n"+uploadFile);
  34. mtv2=(TextView)findViewById(R.id.mtv2);
  35. mtv2.setText("上传地址:\n"+actionUrl);
  36. bupload=(Button)findViewById(R.id.bupload);
  37. bupload.setOnClickListener(newView.OnClickListener(){
  38. @Override
  39. publicvoidonClick(Viewv){
  40. //TODOAuto-generatedmethodstub
  41. FileUploadTaskfileuploadtask=newFileUploadTask();
  42. fileuploadtask.execute();
  43. }
  44. });
  45. }
  46. //showDialogmethod
  47. privatevoidshowDialog(Stringmess){
  48. newAlertDialog.Builder(UploadtestActivity.this).setTitle("Message")
  49. .setMessage(mess)
  50. .setNegativeButton("确定",newDialogInterface.OnClickListener(){
  51. @Override
  52. publicvoidonClick(DialogInterfacedialog,intwhich){
  53. }
  54. }).show();
  55. }
  56. classFileUploadTaskextendsAsyncTask<Object,Integer,Void>{
  57. privateProgressDialogdialog=null;
  58. HttpURLConnectionconnection=null;
  59. DataOutputStreamoutputStream=null;
  60. DataInputStreaminputStream=null;
  61. //thefilepathtoupload
  62. StringpathToOurFile="/sdcard/testimg.jpg";
  63. //theserveraddresstoprocessuploadedfile
  64. StringurlServer="http://10.100.1.208/receive_file.php";
  65. StringlineEnd="\r\n";
  66. StringtwoHyphens="--";
  67. Stringboundary="*****";
  68. FileuploadFile=newFile(pathToOurFile);
  69. longtotalSize=uploadFile.length();//Getsizeoffile,bytes
  70. @Override
  71. protectedvoidonPreExecute(){
  72. dialog=newProgressDialog(UploadtestActivity.this);
  73. dialog.setMessage("正在上传...");
  74. dialog.setIndeterminate(false);
  75. dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  76. dialog.setProgress(0);
  77. dialog.show();
  78. }
  79. @Override
  80. protectedVoiddoInBackground(Object...arg0){
  81. longlength=0;
  82. intprogress;
  83. intbytesRead,bytesAvailable,bufferSize;
  84. byte[]buffer;
  85. intmaxBufferSize=256*1024;//256KB
  86. try{
  87. FileInputStreamfileInputStream=newFileInputStream(newFile(
  88. pathToOurFile));
  89. URLurl=newURL(urlServer);
  90. connection=(HttpURLConnection)url.openConnection();
  91. //Setsizeofeveryblockforpost
  92. connection.setChunkedStreamingMode(256*1024);//256KB
  93. //AllowInputs&Outputs
  94. connection.setDoInput(true);
  95. connection.setDoOutput(true);
  96. connection.setUseCaches(false);
  97. //EnablePOSTmethod
  98. connection.setRequestMethod("POST");
  99. connection.setRequestProperty("Connection","Keep-Alive");
  100. connection.setRequestProperty("Charset","UTF-8");
  101. connection.setRequestProperty("Content-Type",
  102. "multipart/form-data;boundary="+boundary);
  103. outputStream=newDataOutputStream(
  104. connection.getOutputStream());
  105. outputStream.writeBytes(twoHyphens+boundary+lineEnd);
  106. outputStream
  107. .writeBytes("Content-Disposition:form-data;name=\"uploadedfile\";filename=\""
  108. +pathToOurFile+"\""+lineEnd);
  109. outputStream.writeBytes(lineEnd);
  110. bytesAvailable=fileInputStream.available();
  111. bufferSize=Math.min(bytesAvailable,maxBufferSize);
  112. buffer=newbyte[bufferSize];
  113. //Readfile
  114. bytesRead=fileInputStream.read(buffer,0,bufferSize);
  115. while(bytesRead>0){
  116. outputStream.write(buffer,0,bufferSize);
  117. length+=bufferSize;
  118. progress=(int)((length*100)/totalSize);
  119. publishProgress(progress);
  120. bytesAvailable=fileInputStream.available();
  121. bufferSize=Math.min(bytesAvailable,maxBufferSize);
  122. bytesRead=fileInputStream.read(buffer,0,bufferSize);
  123. }
  124. outputStream.writeBytes(lineEnd);
  125. outputStream.writeBytes(twoHyphens+boundary+twoHyphens
  126. +lineEnd);
  127. publishProgress(100);
  128. //Responsesfromtheserver(codeandmessage)
  129. intserverResponseCode=connection.getResponseCode();
  130. StringserverResponseMessage=connection.getResponseMessage();
  131. /*将Response显示于Dialog*/
  132. //Toasttoast=Toast.makeText(UploadtestActivity.this,""
  133. //+serverResponseMessage.toString().trim(),
  134. //Toast.LENGTH_LONG);
  135. //showDialog(serverResponseMessage.toString().trim());
  136. /*取得Response内容*/
  137. //InputStreamis=connection.getInputStream();
  138. //intch;
  139. //StringBuffersbf=newStringBuffer();
  140. //while((ch=is.read())!=-1){
  141. //sbf.append((char)ch);
  142. //}
  143. //
  144. //showDialog(sbf.toString().trim());
  145. fileInputStream.close();
  146. outputStream.flush();
  147. outputStream.close();
  148. }catch(Exceptionex){
  149. //Exceptionhandling
  150. //showDialog(""+ex);
  151. //Toasttoast=Toast.makeText(UploadtestActivity.this,""+
  152. //ex,
  153. //Toast.LENGTH_LONG);
  154. }
  155. returnnull;
  156. }
  157. @Override
  158. protectedvoidonProgressUpdate(Integer...progress){
  159. dialog.setProgress(progress[0]);
  160. }
  161. @Override
  162. protectedvoidonPostExecute(Voidresult){
  163. try{
  164. dialog.dismiss();
  165. //TODOAuto-generatedmethodstub
  166. }catch(Exceptione){
  167. }
  168. }
  169. }
  170. }

服务器端仍然和之前的一样。

这里使用了AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单,适用于简单的异步处理,不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
  Params 启动任务执行的输入参数,比如HTTP请求的URL。
  Progress 后台任务执行的百分比。
  Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
  1) 子类化AsyncTask
  2) 实现AsyncTask中定义的下面一个或几个方法
  onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
  doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
  onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
  onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
  1) Task的实例必须在UI thread中创建
  2) execute方法必须在UI thread中调用
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
  4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。

运行结果如下:


Android上传文件到Web服务器,PHP接收文件(二)_第1张图片

更多相关文章

  1. Android 获取系统设置参数。
  2. Android 学习笔记 Contacts (一)ContentResolver query 参数详解
  3. Android notification点击跳转到Activity,点击返回跳转,前一条消息
  4. Android:UI更新方法四:在Worker Thread中runOnUiThread直接刷新U
  5. Android 获取屏幕高宽度,密度,通知栏高度,截图等常用方法
  6. Android退出程序的多种方法
  7. Android数据共享 sharedPreferences 的使用方法

随机推荐

  1. Android 系統存在設計漏洞,釣魚網站隨時出
  2. ListView 取消点击效果
  3. 【Android的从零单排开发日记】之入门篇(
  4. android 基础知识整理 1
  5. 详解Android 触摸事件处理和传递过程的来
  6. android 访问SD卡的方法
  7. Android(安卓)API demos 阅读笔记 4
  8. android定义全局变量
  9. Android开发者收入仅相当于iOS应用24%(同
  10. Google 发布 Android @ Home,让你用 Andro