Android文件上传到服务端实践指南
165 浏览量
更新于2024-09-01
收藏 74KB PDF 举报
Android 上传文件到服务端并显示进度条
Android 上传文件到服务端并显示进度条是 Android 开发中的一项重要技术,以下是该技术的详细知识点:
一、Android 上传文件到服务端
Android 上传文件到服务端主要使用的是 HttpURLConnection 类,该类提供了基本的 HTTP 连接功能,可以用来实现文件上传。下面是一个简单的示例代码:
```java
private class UploadTask extends AsyncTask<Object, Integer, Void> {
private DataOutputStream outputStream = null;
private String fileName;
private String uri;
private String mLineEnd = "\r\n";
private String mTwoHyphens = "--";
private String boundary = "*";
File uploadFile;
long mTtotalSize; // Getsize of file, bytes
public UploadTask(String fileName, String uri) {
this.fileName = fileName;
this.uri = uri;
uploadFile = new File(fileName);
mTtotalSize = uploadFile.length();
}
/
* 开始上传文件
*
* @param objects
* @return
*/
@Override
protected Void doInBackground(Object... objects) {
long length = 0;
int mBytesRead, mBytesAvailable, mBufferSize;
byte[] buffer;
int maxBufferSize = 256 * 1024; // 256KB
try {
FileInputStream fileInputStream = new FileInputStream(new File(fileName));
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
outputStream = new DataOutputStream(con.getOutputStream());
// 上传文件
outputStream.writeBytes(mTwoHyphens + boundary + mLineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + mLineEnd);
outputStream.writeBytes(mLineEnd);
byte[] buffer = new byte[maxBufferSize];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer, 0, maxBufferSize)) != -1) {
outputStream.write(buffer, 0, bytesRead);
length += bytesRead;
publishProgress((int) ((length / (float) mTtotalSize) * 100));
}
outputStream.writeBytes(mLineEnd);
outputStream.writeBytes(mTwoHyphens + boundary + mTwoHyphens + mLineEnd);
int responseCode = con.getResponseCode();
if (responseCode == 200) {
Log.d("UploadTask", "上传成功");
} else {
Log.d("UploadTask", "上传失败");
}
} catch (Exception e) {
Log.d("UploadTask", "上传失败" + e.getMessage());
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
Log.d("UploadTask", "关闭流失败" + e.getMessage());
}
}
return null;
}
}
```
二、显示进度条
显示进度条可以使用 Android 提供的 ProgressBar 组件,以下是一个简单的示例代码:
```java
private ProgressBar mPgBar;
// 在AsyncTask中更新进度条
@Override
protected void onProgressUpdate(Integer... progress) {
mPgBar.setProgress(progress[0]);
}
// 在AsyncTask中显示进度条
@Override
protected void onPostExecute(Void result) {
mPgBar.setVisibility(View.GONE);
}
```
三、服务端代码
服务端代码可以使用多种语言实现,以下是一个使用 Java 实现的简单示例代码:
```java
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getHeader("file");
File file = new File("upload/" + fileName);
if (!file.exists()) {
file.mkdirs();
}
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
String name = item.getFieldName();
if (item.isFormField()) {
String value = item.getString();
System.out.println("Form field " + name + " with value " + value);
} else {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
System.out.println("Field " + fieldName);
System.out.println("FileName " + fileName);
System.out.println("ContentType " + contentType);
System.out.println("Size (bytes) " + sizeInBytes);
System.out.println("InMemory " + isInMemory);
// 保存文件
File uploadedFile = new File("upload/" + fileName);
item.write(uploadedFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
Android 上传文件到服务端并显示进度条是一项复杂的技术,需要使用多种技术栈,包括 HttpURLConnection、AsyncTask、ProgressBar 等,但通过合理的设计和实现,我们可以实现该功能。
105 浏览量
2014-09-10 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-05-27 上传
2023-05-27 上传
2023-05-27 上传
2023-07-13 上传
weixin_38731761
- 粉丝: 7
- 资源: 920
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解