最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂、直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了一番,把它们发出来,希望更多人能受用。
文件上传
通过org.apache.commons.httpclIEnt.httpClIEnt来实现文件上传,该jar包可以直接从网上所搜、下载。
/** * @param mContext 上下文 * @param targetUrl 文件上传地址 * @param filePath 文件路径 */ public voID uploadfile(final Activity mContext,String targetUrl,final String filePath) { System.out.println("targetUrl: " + targetUrl + " filePath: " + filePath); if (TextUtils.isEmpty(filePath)) { Toast.makeText(mContext,"文件不存在",Toast.LENGTH_SHORT).show(); return; } final PostMethod filePost = new PostMethod(targetUrl) {//这个用来中文乱码 public String getRequestCharSet() { return "UTF-8"; } }; try { final httpClIEnt clIEnt = new httpClIEnt(); file file = new file(filePath); if (file.exists() && file.isfile()) { long fileSize = file.length(); if (fileSize >= 5 * 1024 * 1024) { Toast.makeText(mContext,"文件不得大于5M",Toast.LENGTH_SHORT).show(); return; } } else { Toast.makeText(mContext,Toast.LENGTH_SHORT).show(); return; } // 上传文件和参数 Part[] parts = new Part[]{new CustomfilePart(file.getname(),file),new StringPart("filename",file.getname(),"UTF-8")}; filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams())); new Thread(new Runnable() { @OverrIDe public voID run() { int statuscode = 0; try { statuscode = clIEnt.executeMethod(filePost); } catch (IOException e) { e.printstacktrace(); } final int finalStatuscode = statuscode; mContext.runOnUiThread(new Runnable() { @OverrIDe public voID run() { if (finalStatuscode == httpStatus.SC_OK) { Toast.makeText(mContext,"上传成功",Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext,"上传失败",Toast.LENGTH_SHORT).show(); } } }); } }).start(); } catch (Exception ex) { ex.printstacktrace(); } }
httpClIEnt的使用,常常会遇到乱码问题,我们主要在两个地方解决乱码问题:
•复写PostMethod 的getRequestCharSet,指定请求编码
final PostMethod filePost = new PostMethod(targetUrl) {//这个用来中文乱码 public String getRequestCharSet() { return "UTF-8"; } };
•自定义filePart,指定请求参数编码
/** * 解决中文文件名乱码 */public class CustomfilePart extends filePart { public CustomfilePart(String filename,file file) throws fileNotFoundException { super(filename,file); } protected voID senddispositionheader(OutputStream out) throws IOException { super.senddispositionheader(out); String filename = getSource().getfilename(); if (filename != null) { out.write(EnCodingUtil.getAsciiBytes(file_name)); out.write(QUOTE_BYTES); out.write(EnCodingUtil.getBytes(filename,"UTF-8")); out.write(QUOTE_BYTES); } }}
使用CustomfilePart添加参数:
Part[] parts = new Part[]{new CustomfilePart(file.getname(),"UTF-8")};filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));
文件下载
通过httpURLConnection下载文件。
/** * @param urlStr 文件地址 * @param path 文件保存路径 * @param filename 文件名 * @return 文件的绝对路径 */ public String downfile(String urlStr,String path,String filename) { inputStream inputStream = null; String filePath = null; try { fileUtils fileUtils = new fileUtils(); //判断文件是否存在 if (fileUtils.isfileExist(path + filename)) { System.out.println("exits"); filePath = Sdpath + path + filename; } else { //得到io流 inputStream = getinputStreamFromURL(urlStr); //从input流中将文件写入SD卡中 file resultfile = fileUtils.write2SDFrominput(path,filename,inputStream); if (resultfile != null) { filePath = resultfile.getPath(); } } } catch (Exception e) { e.printstacktrace(); } finally { try { if (inputStream != null) inputStream.close(); } catch (IOException e) { e.printstacktrace(); } } return filePath; } /** * 根据URL得到输入流 * * @param urlStr * @return */ public inputStream getinputStreamFromURL(String urlStr) { httpURLConnection urlConn; inputStream inputStream = null; try { url = new URL(urlStr); urlConn = (httpURLConnection) url.openConnection(); inputStream = urlConn.getinputStream(); } catch (Exception e) { e.printstacktrace(); } return inputStream; }
文件下载其实很简单,说白了,就是通过http获取inputStream ,然后通过解析inputStream 并写入到文件即可。
读取inputstream并写入到SDCard。
/** * 将一个inputStream里面的数据写入到SD卡中 * * @param path 文件保存路径 * @param filename 文件保存的名字 * @param input 文件输入流 * @return 文件 */ public file write2SDFrominput(String path,String filename,inputStream input) { file file = null; OutputStream output = null; try { // 创建文件夹 createSDDir(path); // 创建文件 file = createSDfile(path + filename); // 开启输出流,准备写入文件 output = new fileOutputStream(file); // 缓冲区 byte[] buffer = new byte[fileSIZE]; int count; while ((count = input.read(buffer)) != -1) { // 这里,请一定按该方式写入文件,不然时而会出现文件写入错误,数据丢失问题 output.write(buffer,count); } output.flush(); } catch (Exception e) { e.printstacktrace(); } finally { try { output.close(); input.close(); } catch (IOException e) { e.printstacktrace(); } } return file; }
inputstream写入到sdcard卡中,有个很重要的地方,先看下OutputStream 的write方法:
我推荐使用第二个方法write(byte[] b,int off,int len) ,目的是为了避免数据丢失。所以写文件代码如下:
while ((count = input.read(buffer)) != -1) { // 这里,请一定按该方式写入文件,不然时而会出现文件写入错误,数据丢失问题 output.write(buffer,count);}
源码地址:https://github.com/zuiwuyuan/Http_Uploader_Downloader
以上便是我整理的AndroID http实现文件的上传和下载方法,希望对更多的人有所帮助。
以上是内存溢出为你收集整理的Android Http实现文件的上传和下载全部内容,希望文章能够帮你解决Android Http实现文件的上传和下载所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)