Android上传文件到服务端并显示进度条

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

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

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" />

这里主要定义上传文件的临时存放位置,然后大小限制。
大家可以根据实际情况进行配置。

最后上传一张效果图。

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

(0)

相关推荐

  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. demo运行截图: AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传.AsyncTask定义了三种泛型类型Params,Progress和Result. 1.Params 启动任务执行的输入参数,比

  • Struts2实现文件上传时显示进度条功能

    最近在做一个资源共享的项目中,采用了Struts2.1.8+Spring2.5.6+hibernate3.32的框架整合方式进行开发.在文件上传这块,因为需要实现文件上传时显示进度条的功能,所以尝试了一下.怕以后忘记,先贴出来分享下. 要在上传文件时能显示进度条,首先需要实时的获知web服务端接收了多少字节,以及文件总大小,这里我们在页面上使用AJAX技术每一秒向服务器发送一次请求来获得需要的实时上传信息.但是当我们使用struts2后怎么在服务端获得实时的上传大小呢?这里需要用到commons

  • servlet+jquery实现文件上传进度条示例代码

    现在文件的上传,特别是大文件上传,都需要进度条,让客户知道上传进度. 本文简单记录下如何弄进度条,以及一些上传信息,比如文件的大小,上传速度,预计剩余时间等一些相关信息.代码是匆忙下简单写的,一些验证没做,或代码存在一些隐患,不严谨的地方.本文代码只供参考. 进度条的样式多种多样,有些网站弄得非常绚烂漂亮.本文UI端不太懂,只会一些简单的基本的css而已,所以进度条弄得不好看.本文侧重的给读者提供一个参考,一个实现思路而已. 注:由于jQuery版本用的是2.1.1,所以如果跑本例子源码,请用I

  • struts2实现文件上传显示进度条效果

    一. struts2读取进度原理分析(作为草稿存了好久,刚刚发布出来......) 1. 在strut2中控制文件上传信息的类是实现MultiPartRequest接口的JakartaMultiPartRequest 其实第一次看到源文件时我打了个退堂鼓,因为觉得内容太长了,不想看.冷静下来将思路理顺,将分开的各个方法还原到一个方方中中,发现还是很好理解的: @Override public void parse(HttpServletRequest request, String saveDi

  • springMVC+ajax实现文件上传且带进度条实例

    前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name="filename" value= ""/></p > <p >上传文件: <input type="file" name="file"/></ p> <input ty

  • Struts2 文件上传进度条的实现实例代码

    最近在写我们大三项目的一个视频文件上传的页面,实现后台对上传的进度进行监听,然后将监听的信息返回给前台页面. 前台的页面效果图: 前台进度条控件选择使用easyui 的progressbar控件. 详细的使用说明参考官网文档:http://www.jeasyui.com/documentation/index.php 所有需要引入jquery-1.11.1.min.js 以及jquery.easyui.min.js 一.前台的代码: <%@ page language="java"

  • springMVC实现前台带进度条文件上传的示例代码

    项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下: 详细实现如下: 1.mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/s

  • Android上传文件到服务端并显示进度条

    最近在做上传文件的服务,简单看了网上的教程.结合实践共享出代码. 由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢. Ok,先上代码. Android 上传比较简单,主要用到的是 HttpURLConnection 类,然后加一个进度条组件. private ProgressBar mPgBar; class UploadTask extends AsyncTask<Object,Integer,Void>{ private DataOutputStream outputStr

  • Android实现文件上传和下载倒计时功能的圆形进度条

    screenshot 截图展示 import step1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step2. Add the dependency dependencies { compile 'com.github.yanjiabin:ExtendsRingPrigr

  • Android上传文件到Web服务器 PHP接收文件

    Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件.使用JavaServlet来接收文件的方法比较常见,在这里给大家介绍一个简单的服务器端使用PHP语言来接收文件的例子. 服务器端代码比较简单,接收传输过来的文件: <?php $target_path = "./upload/";//接收文件目录 $target_path = $target_path . basenam

  • android 上传文件到服务器代码实例

    android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置!  如果这些都弄好了,上传就很简单了!   下面是我写的一个上传的工具类: 复制代码 代码如下: package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.

  • Android上传文件到服务器的方法

    本文实例为大家分享了Android端实现文件上传的具体代码,供大家参考,具体内容如下 1).新建一个Android项目命名为androidUpload,目录结构如下: 2).新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream;

  • 使用ajaxfileupload.js实现ajax上传文件php版

    无论是PHP,还是其他的服务端脚本都提供了文件上传功能,实现起来也比较简单.而利用JavaScript来配合,即可实现Ajax方式的文件上传.虽然jQuery本身没有提供这样的简化函数,但有不少插件可以实现.其中,Phpletter.com提供的ajaxfileupload.js是一个轻量的插件,而且编写方式与jQuery提供的全局方法$.post()非常相似,简单易用. 不过,该插件实在太简化了,除了可提供需上传文件的路径外,也就不能传递额外的值到后台服务端.所以,我修改了一下该脚本,增加个一

  • SpringBoot 如何优雅的实现跨服务器上传文件的示例

    项目完整代码链接:代码链接 跨服务上传文件示意图 一.创建项目 springboot:2.2.6 JDK:1.8 由于资源有限,就用不同端口表示不同服务器了. 1.1 上传文件的项目 首先idea快速搭建工具创建一个springboot项目,名字为fileupload,作为上传文件的服务端. 选择spring web模块即可 配置相关参数 spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=30

  • PHP+AjaxForm异步带进度条上传文件实例代码

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: var object= { url:url, //form提交数据的地址 type:type, //form提交的方式(method:post/get) target:target, //服务器返回的响应数据显示的元素(Id)号 beforeSerialize:function(){} //序列化提交

  • jquery实现上传文件进度条

    本文实例为大家分享了jquery实现上传文件进度条的具体代码,供大家参考,具体内容如下 首先引入需要的js  css 用bootstrap进度条 <link rel="stylesheet" href="js/bootstrap/bootstrap.min.css" > <script type="text/javascript" src="js/jquery-3.2.1.min.js"></sc

  • Node.js上传文件功能之服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件上传进度的方法?>.稍微回答了下,这里顺便整理出来,有同样疑问的同学可以参考. 下文主要介绍如何利用progress-stream获取文件上传进度,以及该组件使用过程中的注意事项. 利用progress-stream获取文件上传进度 如果只是想在服务端获取上传进度,可以试下如下代码.注意,这个模块跟Ex

随机推荐