最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。

由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。

Ok,先上代码。

Android 上传比较简单,主要用到的是 HttpURLConnection 类,然后加一个进度条组件。

private ProgressBar mPgBar;

class UploadTask extends AsyncTask{

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;

//上传文件名集合

private List fileFileName;

//上传文件内容类型集合

private List fileContentType;

public List getFile() {

return file;

}

public void setFile(List file) {

this.file = file;

}

public List getFileFileName() {

return fileFileName;

}

public void setFileFileName(List fileFileName) {

this.fileFileName = fileFileName;

}

public List getFileContentType() {

return fileContentType;

}

public void setFileContentType(List 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 文件进行配置

这里主要定义上传文件的临时存放位置,然后大小限制。

大家可以根据实际情况进行配置。

最后上传一张效果图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android显示服务器端文件夹,Android上传文件到服务端并显示进度条相关推荐

  1. 截取字符串,计算字符串字节大小,选择文件夹,上传文件

    获取(.)点前一个字符 string s = "123_u.jpg"; string strKzm = s.Substring(s.LastIndexOf("." ...

  2. putty psftp 上传文件夹或上传文件到linux

    [PuTTY]从本地传输文件/目录至 Linux 服务器 0,PuTTY 自带 PSFTP.exe 能够用于文件传输 注意:如果不是以超级管理员权限打开命令提示符或接口图标PSFTP,那么系统盘下部分 ...

  3. 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器

    ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...

  4. django 上传文件夹_django上传文件

    template html(模板文件): 有如下一个form: from django importformsclassUploadFileForm(forms.Form): title= forms ...

  5. 用JAVA API实现HDFS常用shell命令的功能(新建文件夹,上传文件,下载文件,判断文件是否存在)

    新建文件夹 package hdfs.files;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fi ...

  6. Java创建文件夹并上传文件到该文件夹

    import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.ope ...

  7. linux xshell上传文件夹,XShell上传文件到Linux服务器上

    Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz. 首先你的Linux上需要安装安装lrzsz工具包,(如果没有安装请执行以下命令,安 ...

  8. JavaScript开发——文件夹的上传和下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  9. java实现文件夹的上传和下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  10. JS开发——文件夹的上传和下载

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

最新文章

  1. 聋哑六年级计算机课教学进度计划,小学六年级下册信息技术教学计划三篇
  2. 06:甲流疫情死亡率
  3. 在 SharePoint 2013 中选择正确的 API 集
  4. C语言,利用递归调用函数求年龄问题 问题描述:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3那个人大2岁。问第3个人多少岁,他说比第2个人大2岁。求5人年龄
  5. python独立图形_Python图形界面(自学Python系列笔记-4)(不定期更新)
  6. 【转载】Java程序设计入门 (二)
  7. mybaties中的selectKey和useGeneratedKeys=true
  8. matlab 卷积改变步长,转载“MATLAB卷积函数改进”
  9. 一天搞懂深度学习—学习笔记3(RNN)
  10. torch.nn.Module.named_parameters(prefix=‘‘, recurse=True)
  11. windows下编译skia
  12. GitBook快速教程 2.2 目录页和普通页
  13. 抖音创作者信用分:如何提升信用等级,获取更多机会
  14. 【HDU 3949】 XOR|线性基
  15. OpenBlas0.3.14编译
  16. 路由框架ARouter的使用与原理分析
  17. 红队APT——反朔源流量加密CSMSF证书指纹C2项目CDN域前置
  18. 发那科机器人程序备份及导入
  19. 较简单的c语言航班管理系统
  20. 计算机硬盘驱动器检查失败,电脑硬盘坏道导致磁盘驱动器出现错误,应怎么解决...

热门文章

  1. 用python搭建个人博客过程_技术分享|利用Python Django一步步搭建个人博客(四)...
  2. Django 执行 makemigrations 显示 No changes detected in app
  3. 梯度下降法的三种形式BGD、SGD以及MBGD
  4. 2336: [HNOI2011]任务调度 - BZOJ
  5. 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动
  6. Flyweight Pattern简单随笔
  7. vue中computed(计算属性)和watch在实现父子组件props同步时的实际区分
  8. Turtle库的学习积累
  9. 项目发布后 Tomcat中只有web-INF文件夹
  10. pat 甲级1013