最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂、直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了一番,把它们发出来,希望更多人能受用。
文件上传
通过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(), file), new StringPart("filename", 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, 0, 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, 0, count); }
源码地址:https://github.com/zuiwuyuan/Http_Uploader_Downloader
以上便是我整理的Android Http实现文件的上传和下载方法,希望对更多的人有所帮助。
本文向大家介绍JavaServlet的文件上传和下载实现方法,包括了JavaServlet的文件上传和下载实现方法的使用技巧和注意事项,需要的朋友参考一下 先分析一下上传文件的流程 1-先通过前段页面中的选择文件选择要上传的图片 index.jsp 2-点击提交按钮,通过ajax的文件上传访问服务器端 common.js 3-服务器端响应保存或者下载 保存上传文件的FileUpload.jav
本文向大家介绍Jsp+Servlet实现文件上传下载 文件上传(一),包括了Jsp+Servlet实现文件上传下载 文件上传(一)的使用技巧和注意事项,需要的朋友参考一下 文件上传和下载功能是Java Web必备技能,很实用。 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上
本文向大家介绍springboot实现文件上传和下载功能,包括了springboot实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心。大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码。 1.文件上传
本文向大家介绍SpringMVC实现文件的上传和下载实例代码,包括了SpringMVC实现文件的上传和下载实例代码的使用技巧和注意事项,需要的朋友参考一下 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:“用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流”。我回复他说:“使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要
本文向大家介绍PHP实现文件上传和多文件上传,包括了PHP实现文件上传和多文件上传的使用技巧和注意事项,需要的朋友参考一下 在PHP程序开发中,文件上传是一个使用非常普遍的功能,也是PHP程序员的必备技能之一。值得高兴的是,在PHP中实现文件上传功能要比在Java、C#等语言中简单得多。下面我们结合具体的代码实例来详细介绍如何通过PHP实现文件上传和多文件上传功能。 要使用PHP实现文件上传功能,
本文向大家介绍PHP实现文件上传下载实例,包括了PHP实现文件上传下载实例的使用技巧和注意事项,需要的朋友参考一下 本文介绍了PHP实现文件上传与下载,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧。 一、上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可。 1.2 客户端配置 所需:表单页面(选择上传文件); 具体而言:发送方式
本文向大家介绍Retrofit+Rxjava实现文件上传和下载功能,包括了Retrofit+Rxjava实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 Retrofit简介: 在Android API4.4之后,Google官方使用了square公司推出的okHttp替换了HttpClient的请求方式。后来square公司又推出了基于okHttp的网络请求框架:Retrofit。
本文向大家介绍详解SpringBoot下文件上传与下载的实现,包括了详解SpringBoot下文件上传与下载的实现的使用技巧和注意事项,需要的朋友参考一下 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。 单文