文档章节

Android上传文件到Web服务器,PHP接收文件

一别经年
 一别经年
发布于 2014/01/21 13:16
字数 682
阅读 57
收藏 0
package com.tianlei.httpUrlConnection_PHPUpload;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class Upload{
	/** Called when the activity is first created. */
	/**
	 * Upload file to web server with progress status, client: android;
	 * server:php
	 * **/
	private String urlServer = "http://120.126.16.52/uploadfile.php";  //the server address to process the uploaded file
	public String filepath;   //the file path to upload
	private Context c;
	public Upload(Context c, String filepath){
		this.c = c;
		this.filepath = filepath;
	}
	//开始下载并显示进度条
    public void startUpload(){
    	FileUploadTask fileUploadTask = new FileUploadTask();
    	fileUploadTask.execute();
    }
	// show Dialog method
	/*private void showDialog(String mess) {
		new AlertDialog.Builder(c).setTitle("Message")
				.setMessage(mess)
				.setNegativeButton("确定", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
					}
				}).show();
	}*/

	class FileUploadTask extends AsyncTask<Object, Integer, Void> {

		private ProgressDialog dialog = null;
		
		HttpURLConnection connection = null;
		DataOutputStream outputStream = null;
		DataInputStream inputStream = null;
		
		String lineEnd = "\r\n";
		String twoHyphens = "--";
		String boundary = "*****";
		
		File uploadFile = new File(filepath);
		long totalSize = uploadFile.length(); // Get size of file, bytes

		/*该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,
		 * 如在界面上显示一个进度条。 */
		@Override
		protected void onPreExecute() {
			dialog = new ProgressDialog(c);
			dialog.setMessage("正在上传...");
			dialog.setIndeterminate(false);
			dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			dialog.setProgress(0);
			dialog.show();
		}

		/*将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行
		 * 那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。
		 * 该方法是抽象方法,子类必须实现。*/
		@Override
		protected Void doInBackground(Object... arg0) {

			long length = 0;
			int progress;
			int bytesRead, bytesAvailable, bufferSize;
			byte[] buffer;
			int maxBufferSize = 256 * 1024;// 256KB

			try {
				FileInputStream fileInputStream = new FileInputStream(new File(
						filepath));

				URL url = new URL(urlServer);
				connection = (HttpURLConnection) url.openConnection();

				// Set size of every block for post
				connection.setChunkedStreamingMode(256 * 1024);// 256KB

				// Allow Inputs & Outputs
				connection.setDoInput(true);
				connection.setDoOutput(true);
				connection.setUseCaches(false);

				// Enable POST method
				connection.setRequestMethod("POST");
				connection.setRequestProperty("Connection", "Keep-Alive");
				connection.setRequestProperty("Charset", "UTF-8");
				connection.setRequestProperty("Content-Type",
						"multipart/form-data;boundary=" + boundary);

				outputStream = new DataOutputStream(
						connection.getOutputStream());
				outputStream.writeBytes(twoHyphens + boundary + lineEnd);
				outputStream
						.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
								+ filepath + "\"" + lineEnd);
				outputStream.writeBytes(lineEnd);

				bytesAvailable = fileInputStream.available();
				bufferSize = Math.min(bytesAvailable, maxBufferSize);
				buffer = new byte[bufferSize];

				// Read file
				bytesRead = fileInputStream.read(buffer, 0, bufferSize);

				while (bytesRead > 0) {
					outputStream.write(buffer, 0, bufferSize);
					length += bufferSize;
					progress = (int) ((length * 100) / totalSize);
					//调用 publishProgress方法来更新实时的任务进度
					publishProgress(progress);

					bytesAvailable = fileInputStream.available();
					bufferSize = Math.min(bytesAvailable, maxBufferSize);
					bytesRead = fileInputStream.read(buffer, 0, bufferSize);
				}
				outputStream.writeBytes(lineEnd);
				outputStream.writeBytes(twoHyphens + boundary + twoHyphens
						+ lineEnd);
				//进度条100,下载完成
				publishProgress(100);

				/*通过使用Dialog()对话框显示进度条*/
				
				// Responses from the server (code and message)
				//int serverResponseCode = connection.getResponseCode();
				//String serverResponseMessage = connection.getResponseMessage();

				/* 将Response显示于Dialog */
				// Toast toast = Toast.makeText(UploadtestActivity.this, ""
				// + serverResponseMessage.toString().trim(),
				// Toast.LENGTH_LONG);
				// showDialog(serverResponseMessage.toString().trim());
				/* 取得Response内容 */
				// InputStream is = connection.getInputStream();
				// int ch;
				// StringBuffer sbf = new StringBuffer();
				// while ((ch = is.read()) != -1) {
				// sbf.append((char) ch);
				// }
				//
				// showDialog(sbf.toString().trim());

				fileInputStream.close();
				outputStream.flush();
				outputStream.close();

			} catch (Exception ex) {
				// Exception handling
				// showDialog("" + ex);
				// Toast toast = Toast.makeText(UploadtestActivity.this, "" +
				// ex,
				// Toast.LENGTH_LONG);
			}
			return null;
		}
		
		/*在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务
		 *的进展情况,例如通过一个进度条进行展示。*/
		@Override
		protected void onProgressUpdate(Integer... progress) {
			dialog.setProgress(progress[0]);
		}
		/*在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,
		 *后台的计算结果将通过该方法传递到UI thread.*/
		@Override
		protected void onPostExecute(Void result) {
			try {
				dialog.dismiss();  //dismiss the dialog
				// TODO Auto-generated method stub
			} catch (Exception e) {
			}
		}

	}
}


© 著作权归作者所有

一别经年
粉丝 17
博文 174
码字总数 60456
作品 0
西安
程序员
私信 提问
Android上传文件到Web服务器,PHP接收文件

Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件。使用JavaServlet来接收文件的方法比较常见,在这...

Koon.LY
2012/06/25
0
1
客户端通过http方式传输大数据给PHP服务器,有什么好的思路,请网友支招?

最近在做一个类似云笔记的产品,客户端分PC客户端和安卓客户端,自己主要负责后台PHP。目前pc端和安卓端都是通过C#和android各自的http类通过json实现同php的数据传输。但问题来了,通过htt...

lm489155
2014/10/29
1K
2
ios向服务器上传照片失败的问题,求指点

android和ios客户端调用同一个服务器(java)接口上传照片,android成功,ios失败,原因在于android 上传时服务器端Servlet的this.getRequest获得的request对象是multiPartRequestWrapper,i...

wjdroid
2017/11/30
208
2
Android消息推送完美方案

推送功能在手机应用开发中越来越重要,已经成为手机开发的必须。在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折。本文就是用来和大家共同探讨一种Android消息...

Yujan
2014/04/10
0
0
android如何实现批量上传 支持断点,切割文件

求: android下如何实现文件批量上传,要求支持断点续传,使用HTTP协议,同时每个文件在上传的过程中要对文件进行分割处理. 没有服务器端 ,要自己模拟接收.56773282@qq.com...

Otherguy
2011/11/09
5.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

驰骋工作流引擎-督查督办系统

1.概要说明 督查督办系统信息化平台适用于政府,企事业单位的重点项目跟进,重点工程部署,及各级精神的传达等督查督办性工作。开发设计坚持流程式管理的总体思路,充分体现督查事项立项的规...

孟娟
3分钟前
0
0
阿里靠什么支撑 EB 级计算力?

作者 关涛 阿里云智能事业群 研究员 导读:MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute 做了哪些工作,这...

zhaowei121
5分钟前
0
0
mybatis生成代码配置详解

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.o......

事儿爹
8分钟前
0
0
Vuex和表单绑定的一个神级坑再填一遍

vuex有一个很大的缺陷,就是和input输入框的v-model本身是冲突的。 官方文档给出了两种解决方案:https://vuex.vuejs.org/zh/guide/forms.html 一个是使用get和set → 适用于input框比较少的...

LinearLaw
10分钟前
0
0
CPU与GPU的区别

作者讲述的清楚: 我的理解:1 GPU ALU更多 2 Core 更多 3 业务更加专一(主要进行密集计算) 4 缓存区更少 https://www.zhihu.com/question/19903344...

南桥北木
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部