600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android显示服务器端文件夹 Android上传文件到服务端并显示进度条

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

时间:2024-05-08 13:53:38

相关推荐

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

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

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

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 文件进行配置

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

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

最后上传一张效果图。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。