时间:2021-05-20
最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。
由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。
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
到这里就已经才不多完成动作了,现在需要开始写上传的方法 uploadFile(int index),由于定义file 为多文件上传,而我们上传只上传了一个文件,所以这里参数为0
上面方法为将缓存区域的文件 然后搞到了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" />这里主要定义上传文件的临时存放位置,然后大小限制。
大家可以根据实际情况进行配置。
最后上传一张效果图。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
最近在做一个多图片上传的组件,需求是做到多文件依次上传,并显示上传进度条。逻辑部分实现了以后,在更新进度条视图的时候出现一点问题:动态计算生产的进度progre
大文件上传控件(包含进度条) 使用说明如下: 上传进度条控件 Web.config配置
今天整理以前写过的关于上传文件,并显示进度条的程序代码,对该代码进行优化整理。解决了一直困扰的问题:有时进度条没有达到100%,浏览器出现假死现象。在IE8、c
使用uploadify来实现文件上传能够客户端判断文件大小、控制文件上传的类型、实现多文件上传、显示进度条等功能,方便易用,兼容性较好。本例是把dwz中整合up
用node.js实现多文件上传并携带进度条的demo,供大家参考,具体内容如下这个独立封装的需求来自一个朋友公司,他说需要写一个带进度条动画的批量上传文件的组件