每一次都不能上首页,真悲催。。管理员让我上一次首页?

很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构。

整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句



(图片总是显示不好,过天换个主题。)

今天更新上传文件到服务器的内容。这两天需要将图片保存到服务器,因为一般不将图片等数据直接存储在数据库中,数据库中往往只存图片的路径,所以要将图片上传到服务器的某个文件夹中,路径保存在数据库中,这样就可以通过路径来取得图片了。

文件上传的原理

文件上传就是服务器通过request对象获取输入流(getInputStream),将浏览器上传的数据读取出来,保存到服务器端。

注意事项

  1. 请求方式必须为"POST"

  2. CONTENT_TYPE必须设置为mulitipart/form-data

  3. 如果通过网页上传文件的话需要使用组件

    <input type="file" name="file">

Apache-fileupload介绍

Apache-fileupload是Apache提供的方便文件上传的类,可以在commons中找到,官网网址是这个

FileUpload依赖于Commons IO,所以不要忘记包含Commons IO

顺便看一下User guide

  1. 在你确定保存文件之前,确保这是一个文件上传的请求。

    //检查是否是一个文件上传的请求
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  2. 最简单的小例子

    //创建一个工厂对象
    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);
  3. 处理文件上传项

    Iterator<FileItem> iter = iterms.iterator();
    while(iter.hasNext()){
    FileItem item = iter.next();
    if(item.isFormField()){
    //普通的组件
    }else{
    //文件上传组件,将文件保存到服务器
    processUploadFile(item);
    }
    }
  4. 官网还有限制大小、清理等功能,限于时间,我没仔细看,感兴趣的可以自己查看相关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上传文件至服务器(上)的更多相关文章

  1. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  2. ubuntu16.04安装mongodb,创建数据库管理员,上传文件到服务器上

    1.导入软件源得公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.为mongodb创建软件 ...

  3. android上传文件到服务器

    package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...

  4. Android端通过HttpURLConnection上传文件到服务器

    Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...

  5. android -上传文件到服务器

    android上传文件到服务器       重点:最好是设置好content-type这些参数的配置!     package com.spring.sky.image.upload.network; ...

  6. WPF上传文件到服务器

    利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...

  7. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

  8. C 上传文件到服务器(含接收端源码)

    本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...

  9. C# FTP上传文件至服务器代码

    C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...

随机推荐

  1. DotNet处理服务器路径的方法

    项目中需要使用到路径处理的地方比较多,对于路径的解析和匹配有时较为繁琐,现在提供一个对路径进行解析的方法: 1.验证设置路径字符串: /// <summary> /// 验证设置路径字符串 ...

  2. Javascript常用正则表达式汇总

    一.匹配数字和字符串 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数 字:"^\d{n}$&qu ...

  3. 【原创】SQL审核系统

    前言 应公司dba的需求,做了一个sql审核并可以执行.记录的系统,整个系统有三种角色: DBA(需要管理员手动登记) 运维人员(需要管理员手动登记) 开发人员(默认注册后用户) 权限分配如下: 一些 ...

  4. Bootstrap 3.0正式版发布!

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,包含了丰富的Web组件.根据这些组件,开发者可以快速的搭建一个漂亮.功能完备的网站.在经过Bootstrap 3 RC版的测试和 ...

  5. 匿名方法与Lambda表达式

    1.匿名方法 在学习委托时,我们知道委托实例至少要绑定一个方法才能使用,而调用委托实际上是调用了它所关联地方法.一般来说,需要定义一个与委托签名相符的方法,并使之与委托变量关联.如以下代码: Acti ...

  6. 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分

    1.1    架构结构图 1.1.1    层次示意图 1.1.2    模型对象示意图 1.2    IO管理器 IO管理器是对串口和网络通讯链路的管理.调度.针对串口和网络通讯链路的特点,在IO管 ...

  7. MongoDB索引

    1.目的 索引就是用来加速查询的.数据库索引与书籍的索引类似:有了索引就不需要翻遍整本书,数据库则可以直接在索引中查找,使得查找速度能提高几个数量级.在索引中找到条目以后,就可以直接跳转到目标文档的位 ...

  8. 大公司c#&.net转型java的原因有哪些?

    历来就听说有编程语言“鄙视链”的说法,而如今月经贴上的那些事儿,还真让我给遇到了. 以下内容来自知乎,纯属扯淡,易引发口水战,看完勿人身攻击. 目的给盲目的公司决策者.开发人员科普下,有个客观清醒的认 ...

  9. jquery.dataTable.js 基础配置

    $(document).ready(function () { $('#dataTables-example').DataTable({ responsive: true, "bPagina ...

  10. 浅谈网站web框架的本质

    一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_reques ...