Android上传文件至服务器(上)
每一次都不能上首页,真悲催。。管理员让我上一次首页?
很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构。
整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句

(图片总是显示不好,过天换个主题。)
今天更新上传文件到服务器的内容。这两天需要将图片保存到服务器,因为一般不将图片等数据直接存储在数据库中,数据库中往往只存图片的路径,所以要将图片上传到服务器的某个文件夹中,路径保存在数据库中,这样就可以通过路径来取得图片了。
文件上传的原理
文件上传就是服务器通过request对象获取输入流(getInputStream),将浏览器上传的数据读取出来,保存到服务器端。
注意事项
请求方式必须为"POST"
CONTENT_TYPE必须设置为mulitipart/form-data如果通过网页上传文件的话需要使用组件
<input type="file" name="file">
Apache-fileupload介绍
Apache-fileupload是Apache提供的方便文件上传的类,可以在commons中找到,官网网址是这个
FileUpload依赖于Commons IO,所以不要忘记包含Commons IO包
顺便看一下User guide
在你确定保存文件之前,确保这是一个文件上传的请求。
//检查是否是一个文件上传的请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
最简单的小例子
//创建一个工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//配置临时文件存储目录
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File)servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
//创建一个文件上传处理对象
ServletFileUpload upload = new ServletFileUpload(factory);
//解析请求
List<FileItem> iterms = upload.parseRequest(request);
处理文件上传项
Iterator<FileItem> iter = iterms.iterator();
while(iter.hasNext()){
FileItem item = iter.next();
if(item.isFormField()){
//普通的组件
}else{
//文件上传组件,将文件保存到服务器
processUploadFile(item);
}
}
官网还有限制大小、清理等功能,限于时间,我没仔细看,感兴趣的可以自己查看相关API
服务端完整实现
添加一个处理文件上传的Servlet,别忘了在Web.xml中配置,我刚开始不熟悉,想不起来配置了。多注意
public class UploadServlet extends HttpServlet {
PrintWriter out = null;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
out = response.getWriter();
//判断表单是否支持文件上传,就是查看enctype是否是:"multipart/form-data"
boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
if (!isMultipartContent) {
throw new RuntimeException("表单不支持文件上传");
}
System.out.println("支持文件上传");
//创建一个DiskFilefactory工厂类
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//配置一个临时文件存储目录
ServletContext servletContext = this.getServletConfig().getServletContext();
File repositoryFile = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
diskFileItemFactory.setRepository(repositoryFile);
//创建一个新的文件上传处理类
ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
//防止中文乱码
upload.setHeaderEncoding("UTF-8");
//解析请求服务
try {
List<FileItem> itemsList = upload.parseRequest(request);
//遍历表单项数据
for (FileItem fileItem : itemsList) {
if (fileItem.isFormField()) {
//代表是普通表单项
}
else {
//代表是文件上传表单项
processUploadField(fileItem);
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void processUploadField(FileItem fileItem) throws Exception {
// TODO Auto-generated method stub
//创建文件输入流
try {
InputStream inputStream = fileItem.getInputStream();
String directoryRealPathString = this.getServletContext().getRealPath("/WEB-INF/upload");
File storeDirectory = new File(directoryRealPathString);
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();
}
//得到上传文件的名字
String fileName = fileItem.getName();
System.out.println("文件上传的名字是:"+fileName);
if (fileName !=null) {
fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);
}
//解决文件同名问题
fileName = UUID.randomUUID()+"_"+fileName;
//按日期进行目录打散
String childDirectoryString = makeChildDirectory(storeDirectory,fileName);
System.out.println("上传的文件夹是:"+childDirectoryString);
// 文件的存储路径
String filePath = childDirectoryString+File.separator+fileName;
//上传成功,删除临时文件
fileItem.write(new File(storeDirectory,filePath));
//文件的存储路径是
System.out.println("文件的存储路径"+filePath);
// 文件存储的绝对路径
System.out.println("绝对路径:"+storeDirectory+filePath);
out.print("文件上传成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
}
//创建文件存储目录
private String makeChildDirectory(File storeDirectory, String fileName) {
// TODO Auto-generated method stub
int hashCode = fileName.hashCode();
System.out.println("哈希吗:"+hashCode);
//把哈希码转换为16进制的字符
String code =Integer.toHexString(hashCode);
System.out.println(code);
String childDirectory = code.charAt(0)+File.separator+code.charAt(1);
//创建制定目录
File file = new File(storeDirectory,childDirectory);
if (!file.exists()) {
file.mkdirs();
}
return childDirectory;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
### 总结
上面是服务端的实现,下一篇文章更新客户端的实现,jsp网页直接通过上传组件可以上传文件,而Android客户端可以构造一个请求,将文件上传上去。
Android上传文件至服务器(上)的更多相关文章
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...
- ubuntu16.04安装mongodb,创建数据库管理员,上传文件到服务器上
1.导入软件源得公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.为mongodb创建软件 ...
- android上传文件到服务器
package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- android -上传文件到服务器
android上传文件到服务器 重点:最好是设置好content-type这些参数的配置! package com.spring.sky.image.upload.network; ...
- WPF上传文件到服务器
利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...
- joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸
在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...
- C 上传文件到服务器(含接收端源码)
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
随机推荐
- Github团队开发示例(一)
Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6044837.html 我们可以在Github上管理自己的团队项目.团队 ...
- 鼠标移到导航上面 当前的LI变色 处于当前的位置
鼠标移到导航上面 当前的LI变色 处于当前的位置,广泛应用于当前导航. 点击这里查看效果 以下是源代码: <html> <head> <meta http-equiv=& ...
- hdu-1179-二分图最大匹配
Ollivanders: Makers of Fine Wands since 382 BC. Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思? (注:B和b的区别)
B是指字节(Byte)1个字节有8个比特组成 b是指比特(bit)代表一个2进制位(值为0或1) 上过网的朋友应该会听说过网络带宽这个词,可是这个网络带宽的单位到底是什么,为什么有的人说Kbps ...
- 配置文件(App.config文件)
1. 配置文件概述: 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是 co ...
- Java基础学习 -- GUI之 事件处理基础
事件处理可以简单地这么理解,当有一个事件产生,程序要根据这个事件做出响应.比如,我们做了一个可以通过按钮改变背景颜色的窗口,当我们点击按钮时便产生了一个事件,程序会根据这个事件来做出响应,也就是去改变 ...
- Linux(Centos)之安装Java JDK及注意事项
1.准备工作 a.因为Java JDK区分32位和64位系统,所以在安装之前必须先要判断以下我们的Centos系统为多少位系统,命令如下: uname -a 解释:如果有x86_64就是64位的,没有 ...
- 轻松掌握:JavaScript组合模式
组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...
- 征友记之---前端开发Partner
简单自述下: 本人前端开发者,深圳一公司在职员工,非出自前端科班,乃自学前端已近两年之久. 受前端 ...
- SharePoint 2013 文档库中PPT转换PDF
通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) ...