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上传文件至服务器并提供客户端下载的基本流程和关键知识点。具体实现时,需要结合实际项目需求和所选技术栈进行调整。提供的源码可以帮助理解并实践这些步骤。在实际开发中,确保遵循最佳实践,提高...
- 对上传文件进行验证,限制可接受的文件类型和大小,防止恶意文件上传。 - 保护服务器免受DoS攻击,限制并发上传的数量。 - 为敏感数据加密,确保传输过程中数据的安全。 9. **性能优化**: - 使用断点续传或...
在Android平台上,将文件...以上就是Android上传文件到服务器的关键知识点,包括OkHttp的使用、Multipart上传、进度显示、错误处理、权限管理以及线程控制。实际开发中,还需要根据具体需求和服务器API进行调整和优化。
总之,Android上传文件到.NET服务器涉及客户端与服务器端的交互,需要处理HTTP请求、文件读取和服务器接收等多个环节。通过上述代码示例和注意事项,您可以构建起一个基本的文件上传系统。但实际应用中,可能需要...
在Android平台上进行文件上传至C#服务器是一项常见的任务,尤其在移动应用开发中,比如图片分享、文件同步等场景。本项目提供了一个直接可用的解决方案,无需修改代码或配置即可运行,大大简化了开发流程。 首先,...
总结,Android通过HTTP协议上传文件至远程服务器涉及到客户端的文件读取、HTTP请求构建与执行,以及服务器端的接收、处理和存储。理解这一过程对于进行Android应用开发至关重要,尤其是涉及到用户数据交互的场景。
总的来说,Android上传文件到服务器涉及到客户端和服务端的协同工作,包括文件的读取、HTTP请求的构建、服务器接口的设计以及文件的存储。多文件上传只是在单文件上传的基础上进行扩展,需要对每个文件进行同样的...
综上所述,Android上传图片至服务器的过程涉及到客户端的图片获取、处理、请求创建和发送,以及服务器端的文件接收、保存和响应。在实际开发中,还需要关注安全性、性能优化和错误处理等方面,以提供稳定、高效的...
Android上传文件通常涉及`Multipart/form-data`编码方式,这是HTTP协议中用于处理多部分数据的一种格式,常用于文件上传。通过在请求头设置`Content-Type: multipart/form-data`,然后将文件内容作为请求体的一部分...
本文将详细讲解如何实现Android应用程序上传文件到FTP(File Transfer Protocol)服务器,包括单文件和多文件上传的实现方法。 首先,我们需要理解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议,...
实现:将android文件通过服务端上传至服务器; 获取android本地文件,通过调用服务端后台代码进行文件上传。 只需要分别调用移动端uploadMultiFile()方法和服务端upload()方法。
Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)
在Android应用开发中,...总的来说,实现Android通过HTTP上传文件到服务器涉及客户端的HTTP请求构建和服务器端的Servlet处理。理解这个过程,开发者可以有效地在Android应用中集成文件上传功能,与服务器进行数据交互。
在Android应用开发中,文件上传至...总之,Android上传图片至服务器的过程涉及图片的选择、读取、压缩,以及使用`HttpMime`库构造HTTP POST请求。通过理解这个过程,你可以灵活地将其应用到其他文件类型的上传场景中。
而“Android端上传文件的jar包”则可能是一个包含了实现此类功能的预编译Java类库,方便开发者快速集成到自己的项目中。 这个jar包可能包含以下关键知识点: 1. **网络请求库**:上传文件通常需要一个网络请求库来...
* android上传文件到服务器 * * @param file * 需要上传的文件 * @param RequestURL * 请求的rul * @return 返回响应的内容 */ public static String uploadFile(Map,String>params,File file, ...
以上就是Android设备上传文件到C# WebService的基本步骤和关键知识点。实际开发时,要根据项目需求进行相应的调整和优化。参考提供的链接(http://blog.sina.com.cn/s/blog_8d71d5140101fk8r.html),可以找到更具体...
综上所述,这个Demo涵盖了Android客户端如何通过网络连接向服务器上传文件的整个流程,以及涉及到的主要技术点和注意事项。通过理解这些知识点,开发者可以创建自己的文件上传功能,同时保证上传的可靠性和安全性。
在Android开发中,有时我们需要将应用内的数据或者文件上传到远程服务器,FTP(File Transfer Protocol)是一种常用的文件传输协议,可以实现这一需求。本教程主要介绍如何在Android Studio项目中集成FTP文件上传...
最后,发送STOR命令开始上传文件,同时打开本地文件并读取数据到Socket。 5. **FTP主动模式与被动模式**:FTP有两种工作模式,主动模式和被动模式。主动模式下,服务器主动发起数据连接,而被动模式下,客户端创建...