Android上传文件到服务端并显示进度条
作者:cc杂货圈 时间:2023-06-23 07:48:33
最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。
由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。
Ok,先上代码。
Android 上传比较简单,主要用到的是 HttpURLConnection 类,然后加一个进度条组件。
private ProgressBar mPgBar;
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 ; // Get size 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();
//如果有必要则可以设置Cookie
// conn.setRequestProperty("Cookie","JSESSIONID="+cookie);
// Set size of every block for post
con.setChunkedStreamingMode(256 * 1024);// 256KB
// Allow Inputs & Outputs
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
// Enable POST method
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("Content-Type:application/octet-stream \r\n");
outputStream.writeBytes(mLineEnd);
mbytesAvailable = fileInputStream.available();
mBufferSize = Math.min(mbytesAvailable, maxBufferSize);
buffer = new byte[mBufferSize];
// Read file
mBytesRead = fileInputStream.read(buffer, 0, mBufferSize);
while (mBytesRead > 0) {
outputStream.write(buffer, 0, mBufferSize);
length += mBufferSize;
publishProgress((int) ((length * 100) / mTtotalSize));
mbytesAvailable = fileInputStream.available();
mBufferSize = Math.min(mbytesAvailable, maxBufferSize);
mBytesRead = fileInputStream.read(buffer, 0, mBufferSize);
}
outputStream.writeBytes(mLineEnd);
outputStream.writeBytes(mTwoHyphens + boundary + mTwoHyphens
+ mLineEnd);
publishProgress(100);
// Responses from the server (code and message)
int serverResponseCode = con.getResponseCode();
String serverResponseMessage = con.getResponseMessage();
fileInputStream.close();
outputStream.flush();
outputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
Log.v(TAG,"uploadError");
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
mPgBar.setProgress(progress[0]);
}
}
主要流程为继承AsyncTask,然后使用HttpURLConnection 去上传文件。代码比较简单,就不一一讲解了。
其中要注意的是需要在
outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + mLineEnd);
将name 设置为web 请求的参数名,由于我的服务端是将文件设置为file参数,所以我可以直接填file .所以大家可以根据实际情况作相应修改。
那么接着上服务端代码,服务端主要使用status 2框架作请求。那么我们就需要进行封装。
//上传文件集合
private List<File> file;
//上传文件名集合
private List<String> fileFileName;
//上传文件内容类型集合
private List<String> fileContentType;
public List<File> getFile() {
return file;
}
public void setFile(List<File> file) {
this.file = file;
}
public List<String> getFileFileName() {
return fileFileName;
}
public void setFileFileName(List<String> fileFileName) {
this.fileFileName = fileFileName;
}
public List<String> getFileContentType() {
return fileContentType;
}
public void setFileContentType(List<String> fileContentType) {
this.fileContentType = fileContentType;
}
采用了多文件上传的方法,定义了List 集合。
那么处理文件上传的action ,由于是测试方法。这里就定义为testUpload
public String testUpload()throws Exception{
System.out.println("success");
uploadFile(0);
return SUCCESS;
}
到这里就已经才不多完成动作了,现在需要开始写上传的方法 uploadFile(int index),由于定义file 为多文件上传,而我们上传只上传了一个文件,所以这里参数为0
/**
* 上传功能
* @param i
* @return
* @throws FileNotFoundException
* @throws IOException
*/
private String uploadFile(int i) throws FileNotFoundException, IOException {
try {
InputStream in = new FileInputStream(file.get(i));
//String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);
String dir = "D://UploadData/";
File uploadFile = new File(dir,StringUtils.getUUID()+getFile( this.getFileFileName().get(i)));
OutputStream out = new FileOutputStream(uploadFile);
byte[] buffer = new byte[1024 * 1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.close();
//然后进行计算
return uploadFile.getAbsolutePath();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
上面方法为将缓存区域的文件 然后搞到了D://UploadData/ 文件中,然后以自己的格式进行命名,这里我使用了电脑的UUID和文件名进行组合,确保我复制过来的文件不重复。
最后上传成功之后返回文件的真实地址。
ok,写到这里上传文件的功能基本上做完了。最后只剩下配置action 动作。
ok,我们打开status.xml 文件进行配置
<!-- 系统常量定义,定义上传文件字符集编码 -->
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!-- 系统常量定义,定义上传文件零时存放路径 -->
<constant name="struts.multipart.saveDir" value="c:\tmp\"></constant>
<constant name="struts.multipart.maxSize" value="10000000" />
这里主要定义上传文件的临时存放位置,然后大小限制。
大家可以根据实际情况进行配置。
最后上传一张效果图。
标签:Android,上传,服务端,进度条
0
投稿
猜你喜欢
C#将Sql数据保存到Excel文件中的方法
2023-11-11 08:34:26
C# 4.0 大数的运算--BigInteger的应用详解
2022-02-02 06:40:05
如何在springBoot下搭建日志框架
2021-07-01 03:41:44
Idea中maven项目实现登录验证码功能
2023-11-29 16:50:51
浅谈Synchronized和Lock的区别
2023-10-26 04:28:33
C#实现打印与打印预览功能的思路及代码
2021-09-17 02:51:06
spring 整合mybatis后用不上session缓存的原因分析
2021-12-09 10:11:03
C#异步调用实例小结
2023-07-16 10:31:03
Spring和SpringBoot之间的区别
2022-09-28 11:47:38
android编程之ip2id程序实例
2023-07-20 16:08:09
android 权限大全 分享
2023-03-30 18:06:22
Springboot基于websocket实现简单在线聊天功能
2023-12-21 08:58:18
Spring MVC深入学习之启动初始化过程
2023-07-16 07:04:21
Springboot如何根据实体类生成数据库表
2023-11-20 13:54:39
Java基础之反射详解
2022-06-16 12:25:11
Android 属性动画ValueAnimator与插值器详解
2023-04-12 19:05:33
Javaweb中Request获取表单数据的四种方法详解
2023-10-07 03:07:02
Java 六类运算符详解
2023-08-27 20:37:37
C#串口通信模块使用方法示例
2023-06-19 12:13:57
RxJava中多种场景的实现总结
2023-01-09 05:39:02