`
dewi23
  • 浏览: 9037 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

android上传文件至服务器

 
阅读更多

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

		// private ProgressDialog dialog = null;
		Dialog dialog = new Dialog(PhotoUploadActivity.this,
				R.style.ProgressBarDialog);

		String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
		String PREFIX = "--", LINE_END = "\r\n";
		String CONTENT_TYPE = "multipart/form-data"; // 内容类型

		File uploadFile = new File(filePath);
		long totalSize = uploadFile.length(); // Get size of file, bytes

		ProgressBar mProgress;
		TextView mProgress_txt;

		@Override
		protected void onPreExecute() {
			/*
			 * dialog = new ProgressDialog(PhotoUploadActivity.this);
			 * dialog.setTitle("正在上传...");
			 * dialog.setMessage("0k/"+totalSize/1000+"k");
			 * dialog.setIndeterminate(false);
			 * dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			 * dialog.setProgress(0); dialog.show();
			 */

			dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
			dialog.setContentView(R.layout.dialog_photo_progressbar);
			dialog.setCancelable(true);
			DisplayMetrics dm = PhotoUploadActivity.this
					.getApplicationContext().getResources().getDisplayMetrics();
			int width = dm.widthPixels;
			WindowManager.LayoutParams params = dialog.getWindow()
					.getAttributes();
			params.width = 9 * width / 10;
			dialog.getWindow().setAttributes(params);
			mProgress = (ProgressBar) dialog
					.findViewById(R.id.progress_horizontal);
			mProgress_txt = (TextView) dialog.findViewById(R.id.progress_txt);
			mProgress.setMax(100);
			mProgress.setProgress(0);
			mProgress.setIndeterminate(false);
			dialog.setCancelable(false);// 设置这个对话框不能被用户按[返回键]而取消掉,但测试发现如果用户按了KeyEvent.KEYCODE_SEARCH,对话框还是会Dismiss掉
			// 由于设置alertDialog.setCancelable(false);
			// 发现如果用户按了KeyEvent.KEYCODE_SEARCH,对话框还是会Dismiss掉,这里的setOnKeyListener作用就是屏蔽用户按下KeyEvent.KEYCODE_SEARCH
			dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
				public boolean onKey(DialogInterface dialog, int keyCode,
						KeyEvent event) {
					if (keyCode == KeyEvent.KEYCODE_SEARCH) {
						return true;
					} else {
						return false; // 默认返回 false
					}
				}
			});
			dialog.show();
			dialog.getWindow()
					.setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
		}

		@Override
		protected String doInBackground(Object... arg0) {
			String result = "";
			long length = 0;
			int progress;
			int bytesRead, bytesAvailable, bufferSize;
			byte[] buffer;
			int maxBufferSize = 10 * 1024;// 10KB

			try {
				URL url = new URL(actionUrl);
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				// Set size of every block for post
				conn.setChunkedStreamingMode(128 * 1024);// 128KB
				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 (uploadFile != null) {

					/**
					 * 当文件不为空,把文件包装并且上传
					 */
					DataOutputStream dos = new DataOutputStream(conn
							.getOutputStream());
					StringBuffer sb = new StringBuffer();
					sb.append(PREFIX);
					sb.append(BOUNDARY);
					sb.append(LINE_END);
					/**
					 * 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
					 * filename是文件的名字,包含后缀名的 比如:abc.png
					 */

					sb.append("Content-Disposition: form-data; name=\"myFile\"; filename=\"" + java.net.URLEncoder.encode(uploadFile
									.getName(), "UTF-8") + "\"" + LINE_END);
					sb.append("Content-Type: application/octet-stream; charset="+ CHARSET + LINE_END);
					sb.append(LINE_END);

					dos.write(sb.toString().getBytes());
					InputStream is = new FileInputStream(uploadFile);
					bytesAvailable = is.available();
					bufferSize = Math.min(bytesAvailable, maxBufferSize);// 设置每次写入的大小
					buffer = new byte[bufferSize];
					// Read file
					bytesRead = is.read(buffer, 0, bufferSize);

					while (bytesRead > 0) {
						dos.write(buffer, 0, bufferSize);
						length += bufferSize;
						Thread.sleep(500);
						progress = (int) ((length * 100) / totalSize);
						publishProgress(progress, (int) length);

						bytesAvailable = is.available();
						bufferSize = Math.min(bytesAvailable, maxBufferSize);
						bytesRead = is.read(buffer, 0, bufferSize);
					}
					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();
					publishProgress(100, (int) length);
					/**
					 * 获取响应码 200=成功 当响应成功,获取响应的流
					 */
					int res = conn.getResponseCode();
					Log.e(TAG, "response code:" + res);
					if (res == 200) {
						Log.e(TAG, "request success");
						InputStream input = conn.getInputStream();
						StringBuffer sb1 = new StringBuffer();
						int ss;
						while ((ss = input.read()) != -1) {
							sb1.append((char) ss);
						}
						result = sb1.toString();
						Log.e(TAG, "result : " + result + "fffff"
								+ new File(filePath).getName() + "呵呵呵" + sb1);
					} else {
						Log.e(TAG, "request error");
					}
				}
			} catch (Exception ex) {

			}
			return result;
		}

		@Override
		protected void onProgressUpdate(Integer... progress) {
			// dialog.setProgress(progress[0]);
			// dialog.setMessage(progress[1]/1000+"k/"+totalSize/1000+"k");
			Log.i(TAG, "已经上传----->" + progress[1] / 1000 + "k/" + totalSize
					/ 1000 + "k");
			mProgress.setProgress(progress[0]);
			mProgress_txt.setText(progress[1] / 1000 + "k/" + totalSize / 1000
					+ "k" + "  " + progress[1] * 100 / totalSize + "%");
		}

		@Override
		protected void onPostExecute(String result) {
			try {

				if ("1".equals(result)) {
					Toast.makeText(PhotoUploadActivity.this, "上传成功!",
							Toast.LENGTH_LONG).show();
				} else {
					Toast.makeText(PhotoUploadActivity.this, "上传失败!",
							Toast.LENGTH_LONG).show();
				}

			} catch (Exception e) {

			} finally {
				try {
					dialog.dismiss();
				} catch (Exception e) {

				}
			}
		}
 
分享到:
评论

相关推荐

    android上传文件至服务器提供客户端下载

    以上就是Android上传文件至服务器并提供客户端下载的基本流程和关键知识点。具体实现时,需要结合实际项目需求和所选技术栈进行调整。提供的源码可以帮助理解并实践这些步骤。在实际开发中,确保遵循最佳实践,提高...

    android 选择文件上传至服务器 包含服务器代码

    - 对上传文件进行验证,限制可接受的文件类型和大小,防止恶意文件上传。 - 保护服务器免受DoS攻击,限制并发上传的数量。 - 为敏感数据加密,确保传输过程中数据的安全。 9. **性能优化**: - 使用断点续传或...

    android上传文件到服务器

    在Android平台上,将文件...以上就是Android上传文件到服务器的关键知识点,包括OkHttp的使用、Multipart上传、进度显示、错误处理、权限管理以及线程控制。实际开发中,还需要根据具体需求和服务器API进行调整和优化。

    Android上传文件到 net服务器 包含两方代码

    总之,Android上传文件到.NET服务器涉及客户端与服务器端的交互,需要处理HTTP请求、文件读取和服务器接收等多个环节。通过上述代码示例和注意事项,您可以构建起一个基本的文件上传系统。但实际应用中,可能需要...

    android 上传文件至C#服务器

    在Android平台上进行文件上传至C#服务器是一项常见的任务,尤其在移动应用开发中,比如图片分享、文件同步等场景。本项目提供了一个直接可用的解决方案,无需修改代码或配置即可运行,大大简化了开发流程。 首先,...

    android通过HTTP协议上传文件至远程服务器

    总结,Android通过HTTP协议上传文件至远程服务器涉及到客户端的文件读取、HTTP请求构建与执行,以及服务器端的接收、处理和存储。理解这一过程对于进行Android应用开发至关重要,尤其是涉及到用户数据交互的场景。

    android上传文件到服务器(客户端加服务端源码)

    总的来说,Android上传文件到服务器涉及到客户端和服务端的协同工作,包括文件的读取、HTTP请求的构建、服务器接口的设计以及文件的存储。多文件上传只是在单文件上传的基础上进行扩展,需要对每个文件进行同样的...

    android上传图片至服务器

    综上所述,Android上传图片至服务器的过程涉及到客户端的图片获取、处理、请求创建和发送,以及服务器端的文件接收、保存和响应。在实际开发中,还需要关注安全性、性能优化和错误处理等方面,以提供稳定、高效的...

    Android文件上传+服务器

    Android上传文件通常涉及`Multipart/form-data`编码方式,这是HTTP协议中用于处理多部分数据的一种格式,常用于文件上传。通过在请求头设置`Content-Type: multipart/form-data`,然后将文件内容作为请求体的一部分...

    Android上传文件到服务器

    本文将详细讲解如何实现Android应用程序上传文件到FTP(File Transfer Protocol)服务器,包括单文件和多文件上传的实现方法。 首先,我们需要理解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议,...

    android本地文件上传至服务器

    实现:将android文件通过服务端上传至服务器; 获取android本地文件,通过调用服务端后台代码进行文件上传。 只需要分别调用移动端uploadMultiFile()方法和服务端upload()方法。

    Android 多线程可断点续传上传文件至服务器Demo

    Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)

    android通过http上传文件到服务器

    在Android应用开发中,...总的来说,实现Android通过HTTP上传文件到服务器涉及客户端的HTTP请求构建和服务器端的Servlet处理。理解这个过程,开发者可以有效地在Android应用中集成文件上传功能,与服务器进行数据交互。

    android文件上传至服务器(图片上传)

    在Android应用开发中,文件上传至...总之,Android上传图片至服务器的过程涉及图片的选择、读取、压缩,以及使用`HttpMime`库构造HTTP POST请求。通过理解这个过程,你可以灵活地将其应用到其他文件类型的上传场景中。

    Android端上传文件的jar包

    而“Android端上传文件的jar包”则可能是一个包含了实现此类功能的预编译Java类库,方便开发者快速集成到自己的项目中。 这个jar包可能包含以下关键知识点: 1. **网络请求库**:上传文件通常需要一个网络请求库来...

    Android 上传文件工具类

    * android上传文件到服务器 * * @param file * 需要上传的文件 * @param RequestURL * 请求的rul * @return 返回响应的内容 */ public static String uploadFile(Map,String&gt;params,File file, ...

    Android 上传文件到c# webservice

    以上就是Android设备上传文件到C# WebService的基本步骤和关键知识点。实际开发时,要根据项目需求进行相应的调整和优化。参考提供的链接(http://blog.sina.com.cn/s/blog_8d71d5140101fk8r.html),可以找到更具体...

    android客户端上传文件到服务器端

    综上所述,这个Demo涵盖了Android客户端如何通过网络连接向服务器上传文件的整个流程,以及涉及到的主要技术点和注意事项。通过理解这些知识点,开发者可以创建自己的文件上传功能,同时保证上传的可靠性和安全性。

    Android Studio实现FTP文件上传

    在Android开发中,有时我们需要将应用内的数据或者文件上传到远程服务器,FTP(File Transfer Protocol)是一种常用的文件传输协议,可以实现这一需求。本教程主要介绍如何在Android Studio项目中集成FTP文件上传...

    android FTP 文件上传 socket 源码

    最后,发送STOR命令开始上传文件,同时打开本地文件并读取数据到Socket。 5. **FTP主动模式与被动模式**:FTP有两种工作模式,主动模式和被动模式。主动模式下,服务器主动发起数据连接,而被动模式下,客户端创建...

Global site tag (gtag.js) - Google Analytics