黑马程序员安卓教程:文件上传之服务端
黑马程序员_javaweb讲义和笔记资料
黑马程序员_javaweb讲义和笔记资料
黑马程序员提供的JavaWeb讲义和笔记资料非常详尽,对于学习JavaWeb开发的人来说非常有用。
这些资料涵盖了JavaWeb开发的基础
知识,包括HTML、CSS、JavaScript、Servlet、JSP等方面的内容。
以下是一些黑马程序员提供的JavaWeb讲义和笔记资料的介绍:
1. JavaWeb基础笔记:这是一份详细的笔记,涵盖了JavaWeb开发的基
础知识,包括HTTP协议、Web服务器、Web应用程序架构等方面的内容。
2. JavaWeb进阶笔记:这是一份进阶的笔记,主要介绍了JavaWeb开发
的高级技术,包括多线程、JavaMail、JNDI等方面的内容。
3. JavaWeb实战笔记:这是一份实战的笔记,通过多个案例介绍了JavaWeb开发的实际应用,包括文件上传、在线聊天室、在线购物等方面
的内容。
4. JavaWeb讲义:这是一份详细的讲义,介绍了JavaWeb开发的整个流程,包括开发环境的搭建、HTML/CSS/JavaScript的使用、Servlet/JSP的使用等方面的内容。
这些资料都是黑马程序员精心整理的,非常适合初学者和有一定Java基础的开发者使用。
通过学习这些资料,可以快速掌握JavaWeb开发的基本知识和技能,提高自己的开发能力。
黑马程序员android开发笔记及源码
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
黑马程序员安卓教程:调用服务内部方法的过程
黑马程序员安卓教程:调用服务内部方法的过程我们已知若要调用服务内部的方法,就必须使用bindService的方法绑定该服务,然后通过该服务内部的中间人来调用服务内部的方法,下面我们通过一个案例具体阐述调用服务内部方法的过程。
1.新建工程【File】→【new】→【Android Application Project】命名为:02_调用服务里面的方法2.设计布局图1-1对应的xml布局代码如例1-1所示:由例1-1可知:当点击“绑定服务到中间人”按钮时,程序执行bind方法绑定服务到当前应用;当点击“调用中间人的方法”按钮时,程序执行call方法调用service中的内部方法。
3.编写服务类●在工程包下新建一个服务类“LingdaoService”使之继承Service,代码如例1-2:例1-4可知:在服务类LingdaoService中编写了一个内部类MyBinder并使之继承Binder,在类MyBinder 中编写了一个方法,该方法的作用就是调用服务类LingdaoService中的内部方法即通过中间人调用服务类的内部方法。
中间人MyBinder为何要继承Binder?它有什么作用?参考文档如图1-2:图1-2所示从图1-2可知:Binder是一个远程对象的基类,它实现了IBinder接口。
Binder提供了创建一个本地实例对象的标准。
实现服务类LingdaoService中的onBind方法,返回一个中间人对象MyBinder。
调整例1-2代码如例1-5所示:例1-54.编写点击事件●在Activity中编写按钮的点击事件,绑定服务的点击事件bind代码如例1-6:例1-6bindService方法绑定一个服务。
该方法的第二个参数是一个ServiceConnection类型的对象,编写MyConn类使之继承ServiceConnection,代码如例1-7所示:例1-7●调用call方法点击事件,在call方法中我们可以通过中间人对象来调用服务LingdaoService中的方法,代码如例1-2所示:运行程序,先点击第一个按钮绑定服务并返回中间人对象,效果如图1-3所示:图1-3所示再点击第二个按钮调用服务里的方法。
黑马程序员Java教程:TCP协议上传图片客户端和服务端
TCP协议上传图片客户端和服务端TCP服务端1.import java.io.IOException;2.import .ServerSocket;3.import .Socket;4.import java.io.InputStream;5.import java.io.File;6.import java.io.FileOutputStream;7.import java.io.OutputStream;8.import java.io.FileNotFoundException;9.import java.io.IOException;10.11.public class UploadPicServer12.{13. public static void main(String[] args) throwsFileNotFoundException,IOException {14.15. //创建tcp的socket服务端。
16. ServerSocket ss = new ServerSocket(10006);17.18. //获取客户端。
19. Socket s = ss.accept();20.21. String ip = s.getInetAddress().getHostAddress();22. System.out.println(ip + "......connected");23.24. //读取客户端发来的数据。
25. InputStream in = s.getInputStream();26.27. //将读取到的数据存储到一个文件中。
28. File dir = new File("c:\\pic");29. if(!dir.exists()){30. dir.mkdirs();31. }32. File file = new File(dir,ip + ".bmp");33. FileOutputStream fos = new FileOutputStream(file);34.35. byte[] buf = new byte[1024];36.37. int len = 0;38.39. while((len = in.read(buf)) != -1){40. fos.write(buf,0,len);41. }42.43. //获取socket输出流,将上传成功字样发给客户端。
黑马程序员 python 笔记
文章标题:解锁Python编程技能:成为黑马程序员的必备笔记第一部分:引言1.1 什么是Python编程Python编程语言是一种高级、通用、解释型编程语言。
它在机器学习、人工智能、数据分析等领域有着广泛的应用,被誉为是学习编程的最佳入门语言之一。
对于想要成为优秀程序员或者黑马程序员的人来说,掌握Python编程技能至关重要。
第二部分:入门篇2.1 Python基础语法在学习Python编程之前,了解Python的基础语法是必不可少的。
Python的变量、数据类型、条件语句、循环等。
只有掌握了这些基础知识,才能够更好地理解和应用Python编程。
2.2 Python函数和模块函数和模块是Python编程中非常重要的概念。
函数可以让代码更加模块化和可复用,而模块则可以让代码更加清晰和可维护。
通过学习函数和模块的知识,可以使我们的Python代码更加高效和灵活。
2.3 Python面向对象编程面向对象编程是一种重要的编程范式,而Python是一种面向对象的编程语言。
掌握面向对象编程的知识,可以让我们更好地组织和管理代码,提高代码复用性和可维护性。
第三部分:进阶篇3.1 Python文件操作在实际开发中,文件操作是无法回避的部分。
学习如何使用Python 进行文件读写操作,可以让我们更好地处理数据和文件,实现更丰富的应用场景。
3.2 Python异常处理异常是编程中一种常见的情况,学习如何处理异常可以让我们的代码更加健壮和可靠。
Python提供了丰富的异常处理机制,学习这些知识可以让我们更好地处理各种异常情况。
3.3 Python常用库和框架Python拥有丰富的第三方库和框架,如NumPy、Pandas、Django等。
学习这些常用库和框架,可以让我们更好地开发各种应用,提高开发效率和质量。
第四部分:个人观点和总结4.1 个人观点作为一名编程人员,我深刻理解Python编程技能在今天的重要性。
Python的简洁易读的语法、丰富强大的库和框架、广泛的应用场景,使其成为成为黑马程序员不可或缺的技能之一。
黑马程序员安卓教程:网络编程
网络编程◆◆◆◆◆ 使用 HttpURLConnection 提交数据 使用 HttpClient 提交数据 使用 AsyncHttpClient 框架提交数据 Android 实现多线程下载 使用 xUtils 框架实现多线程下载1.1 前言移动互联网时代哪个 app 不需要跟服务器进行交互呢?Android 给服务器提交数据的方式都有哪些呢?这正是本文前 3 节讨论的话题,每一节介绍一种提交数据的方式,但是 Android 提交数据的方式绝非仅仅这三种,这里给出的只是最基础的 3 中方式。
将这些基础的方式学会了,其他再高级的方式对我们来说也不过是小菜一碟了。
本文的 1.1、1.2、1.3 三节中使用的需求和布局是一模一样的,甚至 1.2 和 1.3 节的工程就是直接从1.1 节中的工程拷贝过来的,唯一不同的就是使用提交数据的框架(类)不同。
因此这里一次性将需求给出。
1.1.1 需求说明如图 1-1 所示,界面整体采用垂直的线性布局,前两行为两个 EditText ,分别代表用户名和密码。
第三、四两行为两个 Button ,前者点击后采用 get 方式提交数据,后者点击后采用 post 方式提交数据。
数据提交成功后,服务器会有返回值,并将返回值用 Toast 显示出来。
1.1.2 服务器搭建服务端采用 Servlet 编写,名为 LoginServlet ,并使用 Tomcat 作为其服务器。
LoginServlet.java 源码见【文件 1-1】,其中黄色高亮部分为核心代码。
该 Servlet 在 web.xml 中的配置见【文件 1-2】。
因为服务器不是本文的重点,因此这里只简单介绍。
【文件 1-1】 LoginServlet.java 1. package com.itheima.servlet; 2. 3. import java.io.IOException;4. import javax.servlet.ServletException;25.import javax.servlet.http.HttpServlet;6.import javax.servlet.http.HttpServletRequest;7.import javax.servlet.http.HttpServletResponse;8.9.public class LoginServlet extends HttpServlet {10.11./**12.* Constructor of the object.13.*/14.public LoginServlet(){15.super();16.}17.18./**19.* Destruction of the servlet.<br>20.*/21.public void destroy(){22.super.destroy();// Just puts"destroy"string in log23.// Put your code here24.}25.26./**27.* The doGet method of the servlet.<br>28.*29.* This method is called when a form has its tag value method equals to get.30.*31.* @param request the request send by the client to the server32.* @param response the response send by the server to the client33.* @throws ServletException if an error occurred34.* @throws IOException if an error occurred35.*/36.public void doGet(HttpServletRequest request,HttpServletResponse response)37.throws ServletException, IOException{38.request.setCharacterEncoding("utf-8");39.String username = request.getParameter("username");40.String password = request.getParameter("password");41.if ("GET".equals(request.getMethod().toUpperCase())) {42.byte[]bytes = username.getBytes("iso-8859-1");ername= new String(bytes, "utf-8");44.}45.46.System.out.println("usernmae===="+username);47.System.out.println("password==="+password);48.response.setCharacterEncoding("utf-8");49.response.getWriter().write("成功收到信息"+username+"/"+password);350. }51.52./**53.* The doPost method of the servlet.<br>54.*55.* This method is called when a form has its tag value method equals to post.56.*57.* @param request the request send by the client to the server58.* @param response the response send by the server to the client59.* @throws ServletException if an error occurred60.* @throws IOException if an error occurred61.*/62.public void doPost(HttpServletRequest request, HttpServletResponse response)63.throws ServletException, IOException{64.65.doGet(request, response);66.}67.68./**69.* Initialization of the servlet. <br>70.*71.* @throws ServletException if an error occurs72.*/73.public void init()throws ServletException {74.// Put your code here75.}76.}【文件1-2】web.xml1.<?xml version="1.0"encoding="UTF-8"?>2.<web-app version="2.5"3.xmlns="/xml/ns/javaee"4.xmlns:xsi="/2001/XMLSchema-instance"5.xsi:schemaLocation="/xml/ns/javaee6./xml/ns/javaee/web-app_2_5.xsd">7.<servlet>8.<servlet-name>LoginServlet</servlet-name>9.<servlet-class>com.itheima.servlet.LoginServlet</servlet-class>10.</servlet>11.<servlet>12.<servlet-name>FileuploadServlet</servlet-name>13.<servlet-class>com.itheima.servlet.FileuploadServlet</servlet-class>14.</servlet>15.<servlet-mapping>416. <servlet-name>LoginServlet</servlet-name>17. <url-pattern>/servlet/LoginServlet</url-pattern>18. </servlet-mapping>19. <servlet-mapping>20. <servlet-name>FileuploadServlet</servlet-name>21. <url-pattern>/servlet/FileuploadServlet</url-pattern>22. </servlet-mapping>23. <welcome-file-list>24. <welcome-file>index.jsp</welcome-file>25. </welcome-file-list> 26. </web-app> 27.图 1-1 多种方式实现用户登录(数据提交)1.1.3 编写布局考虑到 1.2、1.3、1.4 节使用的工程布局是一模一样的,因此在这里先将布局给出。
黑马程序员安卓教程:httpClient提交数据到服务端简述
httpClient提交数据到服务端简述Android应用访问Internet上的资源是很常见的需求,我们一般是通过Http协议来访问网络资源。
在JDK的. HttpURLConnection类中包含了一系列访问网络的API,我们在之前的文档中已详细讲述;为了简化访问网络资源的方法,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(可以理解为浏览器但并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。
下面就这两种不同访问网络资源方式的总结,具体参考下表1-1:HttpURLConnection HttpClient发布者Sun公司Apache组织支持协议Http协议Http协议请求方式Get/Post Get/Post访问过程 1.指定URL路径(拼接参数或不拼接参数)2.建立网络数据连接:HttpUrlConnection3.设置请求方式:get/post4.指定相关参数5.写数据到服务端(若为post请求)6.获取状态码7.接收服务端返回数据1.创建HttpClient对象2.创建请求方式对象,HttpGet对象或HttpPost对象3.传参数,setParams方法(setEntity也可传参,前提是该请求方式是post)4.发送请求,返回HttpResponse5.调用HttpResponse相应的方法,获取返回头,返回码,以及返回内容。
常用的方法Int getResponsed()void setRequestMethod()setRequestProperty()new DefaultHttpClient通过默认实现类返回一个HttpClient实体new HttpGet或new HttpPost包装请求execute()发送请求类型抽象类接口表1-1所示。
黑马程序员安卓教程:Post方式提交数据到服务器
Post方式提交数据到服务器我们已经了解Get方式请求数据到服务器的编写(参考:Get方式提交数据到服务器),下面我们来接着了解Post请求数据的方式。
1.抓取Post数据流Post方式请求数据的原理是怎样的?与Get方式请求数据的过程有什么区别呢?下面我们通过httpwatch来抓取post方式请求数据的过程。
在web项目的jsp页面中接着编写post请求表单,效果如图1-1所示:图1-1所示图1-1对应的jsp页面代码如例1-1:例1-1jsp代码<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><br>Get方式提交数据<form action="LoginServlet" method="get">用户名:<input name="username" type="text"><br>密码:<input name="password" type="password"><br><input type="submit"></form><br>Post方式提交数据<form action="LoginServlet" method="post">用户名:<input name="username" type="text"><br>密码:<input name="password" type="password"><br><input type="submit"></form></body></html>在IE浏览器中访问该登录界面,当以post方式点击“提交查询内容”按钮时,抓取数据流如图1-2所示请求内容长度请求类型请求内容本身图1-2所示2.Get请求和Post请求的区别通过httpwatch抓取Post数据流(本例图1-2)和Get数据流(参考Get方式提交数据流图1-5)我们可以得出如下几个结论:●Get向特定的资源发出请求,Post向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
文件上传原理
文件上传原理
文件上传原理是指将本地的文件通过网络协议发送到服务器端的过程。
在文件上传前,客户端需要先将文件切分成小的数据包,每个数据包都会附带一些元数据信息,比如文件名、文件大小等。
然后,客户端通过网络协议(如HTTP)将这些数据
包逐个发送给服务器。
在发送数据包之前,客户端和服务器需要建立连接。
通常使用TCP协议来建立可靠的连接,并通过握手过程确认连接已建立。
一旦连接建立成功,客户端就可以开始发送数据包了。
客户端将数据包发送给服务器的过程可以分为多个步骤。
首先,客户端会发送一个包含文件信息的请求,告诉服务器将要上传的文件的大小、文件名等信息。
服务器收到这个请求后会进行一系列的检查,比如检查文件是否已经存在、用户是否有权限上传等。
如果通过了检查,服务器会返回一个上传凭证给客户端。
接下来,客户端会将文件切分成小的数据包,并逐个发送给服务器。
在发送每个数据包之前,客户端会计算数据包的校验和,以便服务器端可以验证数据的完整性。
服务器收到数据包后会进行校验和的检查,如果数据包完整则会存储数据包的内容,否则会要求客户端重新发送。
一旦所有的数据包都被发送到服务器,客户端会向服务器发送一个上传完成的请求。
服务器在接收到请求后会进行一些后续的处理,比如将文件存储到指定的位置、更新数据库记录等。
总结来说,文件上传原理包括建立连接、发送文件信息、切分数据包、发送数据包、校验数据完整性、存储文件等步骤。
通过这个过程,客户端可以将本地的文件上传到服务器上,实现了文件共享和传输的功能。
黑马程序员PHP培训教程:Ajax文件上传
Ajax文件上传DOM方式只能获取字符串类型数据,不能获取二进制数据。
可以通过FormData对象来获取二进制数据。
PHP页面HTML页面1<script type="text/javascript">2window.onload=function(){3document.getElementById('btn').onclick=function(){4var frm=document.getElementById('frm');5var fd=new FormData(frm);6var req=new XMLHttpRequest();7req.open('post','./6-demo.php');8req.onreadystatechange=function(){9if(req.readyState==4 && req.status==200){10if(req.responseText=='1'){11alert('上传成功');12}else{13alert('长传失败');14}15}16}17req.send(fd);18}19}20</script>21<form id='frm'><!--不需要enctype属性-->22用户名:<input type="text" name="username" id=""><br>23头像:<input type="file" name="face" id=""><br>24<input type="button" value="注册" id='btn'>25</form>脚下留心:通过FormData对象收集二进制数据不需要设置<form>的enctype属性。
文件上传之服务端
文件上传之服务端
Android开发中,我们常常需要上传文件到服务器,例如上传图片到互联网,上传数据备份到服务器等。
如何上传文件数据,下面我们通过一个案例来讲述文件上传的步骤。
首先我们需要编写上传图片的服务端,用来接收客户端上传过来的数据。
1.新建servlet
在web项目下新建一个Servlet,命名为UploadServlert,如图1-1所示:
图1-1所示
2.编写servlet
新建servlet使之继承HttpServlet,在生成的UploadServlet类中编写doGet方法或者doPost方法,下面我们编写doPost方法,代码如例1-1:
例1-1
3.编写jsp页面
新建一个jsp页面,用来访问服务端,查看该服务端代码是否编写成功。
Jsp页面代码如例1-2:
例1-2
启动Tomcat,部署服务端程序,在浏览器访问服务端,如图1-2所示:
图1-2所示
使用httpwatch抓取数据流,如图1-3所示:
图1-3所示
图1-3抓取的是一个post请求的数据流,该请求操作的请求报文如图1-4所示:
图1-4所示
由图1-4可知发送http请求上传文件的过程:在发送http请求数据时我们需要编写多种请求头,在上传请求体时我们用了拼接的方法将整个数据流上传到服务端。
若要使用HttpUrlConnection来完成上传文件的操作,需要编写大量的工作而且很容易出错。
为此,我们可以继续使用开源框架AsyncHttpClient来完成文件上传的需求。
黑马程序员-传智健康项目(第一章)
⿊马程序员-传智健康项⽬(第⼀章)传智健康项⽬1. 项⽬概述1.1 项⽬介绍传智健康管理系统是⼀款应⽤于健康管理机构的业务系统,实现健康管理机构⼯作内容可视化、会员管理专业化、健康评估数字化、健康⼲预流程化、知识库集成化,从⽽提⾼健康管理师的⼯作效率,加强与会员间的互动,增强管理者对健康管理机构运营情况的了解。
详见:资料中的传智健康PRD⽂档.docx1.2 原型展⽰参见资料中的静态原型。
1.3 技术架构1.4 功能架构1.5 软件开发流程软件开发⼀般会经历如下⼏个阶段,整个过程是顺序展开,所以通常称为瀑布模型。
2. 环境搭建2.1 项⽬结构本项⽬采⽤maven分模块开发⽅式,即对整个项⽬拆分为⼏个maven⼯程,每个maven⼯程存放特定的⼀类代码,具体如下:各模块职责定位:health_parent:⽗⼯程,打包⽅式为pom,统⼀锁定依赖的版本,同时聚合其他⼦模块便于统⼀执⾏maven命令health_common:通⽤模块,打包⽅式为jar,存放项⽬中使⽤到的⼀些⼯具类、实体类、返回结果和常量类health_interface:打包⽅式为jar,存放服务接⼝health_service_provider:Dubbo服务模块,打包⽅式为war,存放服务实现类、Dao接⼝、Mapper映射⽂件等,作为服务提供⽅,需要部署到tomcat运⾏health_backend:传智健康管理后台,打包⽅式为war,作为Dubbo服务消费⽅,存放Controller、HTML页⾯、js、css、spring配置⽂件等,需要部署到tomcat运⾏health_mobile:移动端前台,打包⽅式为war,作为Dubbo服务消费⽅,存放Controller、HTML页⾯、js、css、spring配置⽂件等,需要部署到tomcat运⾏2.2 maven项⽬搭建通过前⾯的项⽬功能架构图可以知道本项⽬分为传智健康管理后台和传智健康前台(微信端)2.2.1 health_parent创建health_parent,⽗⼯程,打包⽅式为pom,⽤于统⼀管理依赖版本pom.xml<!--?xml version="1.0" encoding="UTF-8"?--><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemalocation="/POM/4.0.0/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>com.itheima</groupid><artifactid>health_parent</artifactid><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!-- 集中定义依赖版本号 --><properties><junit.version>4.12</junit.version><spring.version>5.0.5.RELEASE</spring.version><pagehelper.version>4.1.4</pagehelper.version><servlet-api.version>2.5</servlet-api.version><dubbo.version>2.6.0</dubbo.version><zookeeper.version>3.4.7</zookeeper.version><zkclient.version>0.1</zkclient.version><mybatis.version>3.4.5</mybatis.version><mybatis.spring.version>1.3.1</mybatis.spring.version><mybatis.paginator.version>1.2.15</mybatis.paginator.version><mysql.version>5.1.32</mysql.version><druid.version>1.0.9</druid.version><commons-fileupload.version>1.3.1</commons-fileupload.version><spring.security.version>5.0.5.RELEASE</spring.security.version><poi.version>3.14</poi.version><jedis.version>2.9.0</jedis.version><quartz.version>2.2.1</quartz.version></properties><!-- 依赖管理标签必须加 --><dependencymanagement><dependencies><!-- Spring --><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-beans</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-web</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-webmvc</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-jdbc</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-jms</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context-support</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-test</artifactid><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupid>com.alibaba</groupid><artifactid>dubbo</artifactid><version>${dubbo.version}</version></dependency><dependency><groupid>org.apache.zookeeper</groupid><artifactid>zookeeper</artifactid><version>${zookeeper.version}</version></dependency><dependency><groupid>com.github.sgroschupf</groupid><artifactid>zkclient</artifactid><version>${zkclient.version}</version></dependency><dependency><groupid>junit</groupid><artifactid>junit</artifactid><version>4.12</version></dependency><dependency><groupid>com.alibaba</groupid><artifactid>fastjson</artifactid><version>1.2.47</version></dependency><dependency><groupid>javassist</groupid><artifactid>javassist</artifactid><version>3.12.1.GA</version></dependency><dependency><groupid>commons-codec</groupid><artifactid>commons-codec</artifactid><version>1.10</version></dependency><dependency><groupid>com.github.pagehelper</groupid><artifactid>pagehelper</artifactid><version>${pagehelper.version}</version></dependency><!-- Mybatis --><dependency><groupid>org.mybatis</groupid><artifactid>mybatis</artifactid><version>${mybatis.version}</version></dependency><dependency><groupid>org.mybatis</groupid><artifactid>mybatis-spring</artifactid><version>${mybatis.spring.version}</version></dependency><dependency><groupid>com.github.miemiedev</groupid><artifactid>mybatis-paginator</artifactid><version>${mybatis.paginator.version}</version> </dependency><!-- MySql --><dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid><version>${mysql.version}</version></dependency><!-- 连接池 --><dependency><groupid>com.alibaba</groupid><artifactid>druid</artifactid><version>${druid.version}</version></dependency><!-- ⽂件上传组件 --><dependency><groupid>commons-fileupload</groupid><artifactid>commons-fileupload</artifactid><version>${commons-fileupload.version}</version> </dependency><dependency><groupid>org.quartz-scheduler</groupid><artifactid>quartz</artifactid><version>${quartz.version}</version></dependency><dependency><groupid>org.quartz-scheduler</groupid><artifactid>quartz-jobs</artifactid><version>${quartz.version}</version></dependency><dependency><groupid>com.sun.jersey</groupid><artifactid>jersey-client</artifactid><version>1.18.1</version></dependency><dependency><groupid>com.qiniu</groupid><artifactid>qiniu-java-sdk</artifactid><version>7.2.0</version></dependency><!--POI报表--><dependency><groupid>org.apache.poi</groupid><artifactid>poi</artifactid><version>${poi.version}</version></dependency><dependency><groupid>org.apache.poi</groupid><artifactid>poi-ooxml</artifactid><version>${poi.version}</version></dependency></dependency><!-- 安全框架 --><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-web</artifactid><version>${spring.security.version}</version></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-config</artifactid><version>${spring.security.version}</version></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-taglibs</artifactid><version>${spring.security.version}</version></dependency><dependency><groupid>com.github.penggle</groupid><artifactid>kaptcha</artifactid><version>2.3.2</version><exclusions><exclusion><groupid>javax.servlet</groupid><artifactid>javax.servlet-api</artifactid></exclusion></exclusions></dependency><dependency><groupid>dom4j</groupid><artifactid>dom4j</artifactid><version>1.6.1</version></dependency><dependency><groupid>xml-apis</groupid><artifactid>xml-apis</artifactid><version>1.4.01</version></dependency></dependencies></dependencymanagement><dependencies><dependency><groupid>javax.servlet</groupid><artifactid>servlet-api</artifactid><version>${servlet-api.version}</version><scope>provided</scope></dependency></dependencies><build><plugins><!-- java编译插件 --><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.2</version><configuration><source>1.8<target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>2.2.2 health_common创建health_common,⼦⼯程,打包⽅式为jar,存放通⽤组件,例如⼯具类、实体类等pom.xml<!--?xml version="1.0" encoding="UTF-8"?--><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemalocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><parent><artifactid>health_parent</artifactid><groupid>com.itheima</groupid><version>1.0-SNAPSHOT</version></parent><modelversion>4.0.0</modelversion><artifactid>health_common</artifactid><packaging>jar</packaging><dependencies><dependency><groupid>com.github.pagehelper</groupid><artifactid>pagehelper</artifactid></dependency><!-- Mybatis --><dependency><groupid>org.mybatis</groupid><artifactid>mybatis</artifactid></dependency><dependency><groupid>org.mybatis</groupid><artifactid>mybatis-spring</artifactid></dependency><dependency><groupid>com.github.miemiedev</groupid><artifactid>mybatis-paginator</artifactid></dependency><!-- MySql --><dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid></dependency><!-- 连接池 --><dependency><groupid>com.alibaba</groupid><artifactid>druid</artifactid></dependency><dependency><groupid>commons-fileupload</groupid><artifactid>commons-fileupload</artifactid></dependency><!-- Spring --><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-beans</artifactid><artifactid>spring-web</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-webmvc</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-jdbc</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-aspects</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-jms</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context-support</artifactid></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-test</artifactid></dependency><!-- dubbo相关 --><dependency><groupid>com.alibaba</groupid><artifactid>dubbo</artifactid></dependency><dependency><groupid>org.apache.zookeeper</groupid><artifactid>zookeeper</artifactid></dependency><dependency><groupid>com.github.sgroschupf</groupid><artifactid>zkclient</artifactid></dependency><dependency><groupid>junit</groupid><artifactid>junit</artifactid></dependency><dependency><groupid>com.alibaba</groupid><artifactid>fastjson</artifactid></dependency><dependency><groupid>javassist</groupid><artifactid>javassist</artifactid></dependency><dependency><groupid>commons-codec</groupid><artifactid>commons-codec</artifactid></dependency><dependency><groupid>org.apache.poi</groupid><artifactid>poi</artifactid></dependency><dependency><groupid>redis.clients</groupid><artifactid>jedis</artifactid></dependency><dependency><groupid>com.qiniu</groupid><artifactid>qiniu-java-sdk</artifactid></dependency><dependency><groupid>com.sun.jersey</groupid><artifactid>jersey-client</artifactid></dependency><dependency><groupid>org.apache.poi</groupid><artifactid>poi-ooxml</artifactid></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-web</artifactid></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-config</artifactid></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-taglibs</artifactid></dependency></dependencies></project>2.2.5 health_interface创建health_interface,⼦⼯程,打包⽅式为jar,存放服务接⼝pom.xml<!--?xml version="1.0" encoding="UTF-8"?--><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemalocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><parent><artifactid>health_parent</artifactid><groupid>com.itheima</groupid><version>1.0-SNAPSHOT</version></parent><modelversion>4.0.0</modelversion><artifactid>health_interface</artifactid><packaging>jar</packaging><dependencies><dependency><groupid>com.itheima</groupid><artifactid>health_common</artifactid><version>1.0-SNAPSHOT</version></dependency></dependencies></project>2.2.6 health_service_provider创建health_service_provider,⼦⼯程,打包⽅式为war,作为服务单独部署,存放服务类、Dao接⼝和Mapper映射⽂件等pom.xml<!--?xml version="1.0" encoding="UTF-8"?--><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemalocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><parent></parent><modelversion>4.0.0</modelversion><artifactid>health_service_provider</artifactid><packaging>war</packaging><dependencies><dependency><groupid>com.itheima</groupid><artifactid>health_interface</artifactid><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><plugin><groupid>org.apache.tomcat.maven</groupid><artifactid>tomcat7-maven-plugin</artifactid><configuration><!-- 指定端⼝ --><port>81</port><!-- 请求路径 --><path>/</path></configuration></plugin></plugins></build></project>log4j.properties### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.erryout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=c:\\mylog.logyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdoutSqlMapConfig.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><plugins><!-- com.github.pagehelper 为 PageHelper 类所在包名 --><plugin interceptor="com.github.pagehelper.PageHelper"><!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库--><property name="dialect" value="mysql"/></plugin></plugins></configuration>spring-dao.xml<!--?xml version="1.0" encoding="UTF-8"?--><beans xmlns="/schema/beans" xmlns:context="/schema/context" xmlns:p="/schema/p" xmlns:aop="/schema/aop" x /schema/beans/spring-beans-4.2.xsd/schema/context/schema/context/spring-context.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/util/schema/util/spring-util.xsd"><!--数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="username" value="root"><property name="password" value="root"><property name="driverClassName" value="com.mysql.jdbc.Driver"><property name="url" value="jdbc:mysql://localhost:3306/health"></property></property></property></property></bean><!--spring和mybatis整合的⼯⼚bean--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"><property name="configLocation" value="classpath:SqlMapConfig.xml"></property></property></bean><!--批量扫描接⼝⽣成代理对象--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--指定接⼝所在的包--><property name="basePackage" value="com.itheima.dao"></property></bean></beans>spring-tx.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/mvc/schema/mvc/spring-mvc.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/context/schema/context/spring-context.xsd"><!-- 事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启事务控制的注解⽀持注意:此处必须加⼊proxy-target-class="true",需要进⾏事务控制,会由Spring框架产⽣代理对象,Dubbo需要将Service发布为服务,要求必须使⽤cglib创建代理对象。
黑马程序员安卓教程:用户和文件资料权限
用户和文件权限所谓用户即在Android系统下每安装一个应用程序,系统就默认该APP为一个新的用户,也就是说你手机上的每一个APP都是一个用户。
文件的权限我们已经讲述过,那么接下来我们将论述用户与文件权限的关系。
在文件的权限中我们已经新建了4个不同权限的文件,分别为私有的,可读的,可写的,可追加的。
下面我们再新建一个用户(即新建一个项目),在该项目中访问上述新建文件的数据。
1.新建一个用户新建Android项目(other),使用系统自动生成的布局文件,运行程序如图1-1所示:图1-1所示上图表明另一个用户已经建成,接下来,我们就使用当前新建的这个用户来访问文件权限这一项目中生成的4个文件,并将读取的数据打印出来。
2.编写访问代码在新建项目(other)中读取另一个项目(文件权限)中的文件,编写访问代码如例1-2:例1-2 文件访问由上可以得出结论:一个用户访问另一个用户的私有文件是不被允许的,这个私有文件只能被自身用户所访问。
●访问另一用户(文件权限)的可读文件,即将例1-1中的private.dat改为:readable.dat,运行程序,LogCat打印出如图1-3所示的信息:11-26 03:36:09.653: I/System.out(22104): lisi##123图1-3所示由上可以得出结论:一个用户访问另一个用户的可读文件时,这个可读文件是可以被访问的。
●访问另一用户的可写文件,即将例1-1中的private.dat改为:writeable.dat,运行程序,LogCat打印如图1-4所示的信息:图1-4所示由上可以得出结论:一个用户读取另一个用户的可写文件是不被允许的,这个可写文件自能被自身程序所访问;但是当一个用户编辑另一个用户的可写文件,这个操作是被允许的。
●访问另一用户的可追加文件,即将例1-1中的private.dat改为:append.dat,运行程序,LogCat打印如图1-5所示的信息:11-26 03:51:28.213: W/System.err(26286):图1-5所示总结:两个用户之间文件的访问是受到限制的,能否访问成功取决于该文件的权限。
黑马程序员安卓教程:文件访问权限介绍
文件访问权限介绍参考常见目录API的调用,我们在指定路径下新建文件时使用到Context.MODE_PRIVATE这一常量(其实质就是数字0,代表私有权限),Android下新建文件都有哪些权限,它们分别表示什么?1.Android系统下的文件权限概述众所周知,Android系统是基于Linux开发的,因此想要了解Android的文件权限就要从Linux说起。
Linux系统一个文件有三个组别:用户,群组,其它;每一个组包含三种权限:读(r),写(w),执行(x)。
也就是说一个文件有9个权限属性,从左往右一到三位是用户属性,四到六位是群组属性,七到九位是其它属性,如图1-1所示:用户组群组其它图1-1所示2.Android项目中新建不同权限的文件Android下文件权限有多种,常见的有私有(MODE_PRIVATE),追加(MODE_APPEND),可读(MODE_WORLD_READABLE),可写(MODE_WORLD_WRITEABLE)这几种。
参考Android保存和读取数据中的登录项目,我们可以在此项目的基础上新建一个文件访问权限的项目,在该项目中实现点击不同的按钮可以新建不同类型的文件并向该文件中写入数据。
调整登录项目的页面布局如图1-2所示:图1-2所示从上图可以看出:用户可以选择新建文件的类型,当勾选“记住密码”选项时,再点击登录按钮便会将用户名和密码保存到新建文件中。
为了保存数据,我们可以在业务类中添加相应的方法。
1.保存私有文件,业务类中相应的方法,如例1-1:例1-12.保存追加文件,业务类中相应的方法,如例1-2例1-24.保存可写文件,业务类中相应的方法,如例1-4:例1-4public static boolean saveUserInfoWriteable(Context context, String username,String password){try {//得到一个目录 /data/data/当前应用程序包名/files///we do chicken right 上下文环境FileOutputStream fos = context.openFileOutput("writeable.dat", Context.MODE_WORLD_WRITEABLE);// zhangsan##123fos.write((username+"##"+password).getBytes());fos.close();return true;} catch (Exception e) {e.printStackTrace();return false;}}业务方法编写完后,需要调整主Activity的代码,如例1-5所示:} else {Toast.makeText(this, "保存用户名密码失败", 0).show();}}3.查看不同种类型的文件项目部署完成之后,运行程序,分别选择不同的文件类型,从DDMS的文件浏览中可以看到生成的文件,如图1-3所示:图1-3所示由上图可以看出每一个新建文件的权限都是由10位二进制数来表示的,这与上述Linux操作系统下用9位二进制数来表示文件的权限相矛盾。
Android上传文件到服务器的方法
Android上传⽂件到服务器的⽅法本⽂实例为⼤家分享了Android端实现⽂件上传的具体代码,供⼤家参考,具体内容如下1)、新建⼀个Android项⽬命名为androidUpload,⽬录结构如下:2)、新建FormFile类,⽤来封装⽂件信息package com.ljq.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;/*** 上传⽂件*/public class FormFile {/* 上传⽂件的数据 */private byte[] data;private InputStream inStream;private File file;/* ⽂件名称 */private String filname;/* 请求参数名称*/private String parameterName;/* 内容类型 */private String contentType = "application/octet-stream";public FormFile(String filname, byte[] data, String parameterName, String contentType) {this.data = data;this.filname = filname;this.parameterName = parameterName;if(contentType!=null) this.contentType = contentType;}public FormFile(String filname, File file, String parameterName, String contentType) {this.filname = filname;this.parameterName = parameterName;this.file = file;try {this.inStream = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}if(contentType!=null) this.contentType = contentType;}public File getFile() {return file;}public InputStream getInStream() {return inStream;}public byte[] getData() {return data;}public String getFilname() {return filname;}public void setFilname(String filname) {this.filname = filname;}public String getParameterName() {return parameterName;}public void setParameterName(String parameterName) {this.parameterName = parameterName;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}}3)、新建SocketHttpRequester类,封装上传⽂件到服务器代码package com.ljq.utils;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import .InetAddress;import .Socket;import .URL;import java.util.Map;/*** 上传⽂件到服务器** @author Administrator**/public class SocketHttpRequester {/*** 直接通过HTTP协议提交数据到服务器,实现如下⾯表单提交功能:* <FORM METHOD=POST ACTION="http://192.168.1.101:8083/upload/servlet/UploadServlet" enctype="multipart/form-data"><INPUT TYPE="text" NAME="name"><INPUT TYPE="text" NAME="id"><input type="file" name="imagefile"/><input type="file" name="zip"/></FORM>* @param path 上传路径(注:避免使⽤localhost或127.0.0.1这样的路径测试,因为它会指向⼿机模拟器,你可以使⽤或http://192.168.1.101:8083这样的路径测试) * @param params 请求参数 key为参数名,value为参数值* @param file 上传⽂件*/public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志int fileDataLength = 0;for(FormFile uploadFile : files){//得到⽂件类型数据的总长度StringBuilder fileExplain = new StringBuilder();fileExplain.append("--");fileExplain.append(BOUNDARY);fileExplain.append("\r\n");fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");fileExplain.append("\r\n");fileDataLength += fileExplain.length();if(uploadFile.getInStream()!=null){fileDataLength += uploadFile.getFile().length();}else{fileDataLength += uploadFile.getData().length;}}StringBuilder textEntity = new StringBuilder();for (Map.Entry<String, String> entry : params.entrySet()) {//构造⽂本类型参数的实体数据textEntity.append("--");textEntity.append(BOUNDARY);textEntity.append("\r\n");textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");textEntity.append(entry.getValue());textEntity.append("\r\n");}//计算传输给服务器的实体数据总长度int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;URL url = new URL(path);int port = url.getPort()==-1 ? 80 : url.getPort();Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);OutputStream outStream = socket.getOutputStream();//下⾯完成HTTP请求头的发送String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";outStream.write(requestmethod.getBytes());String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.m outStream.write(accept.getBytes());String language = "Accept-Language: zh-CN\r\n";outStream.write(language.getBytes());String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";outStream.write(contenttype.getBytes());String contentlength = "Content-Length: "+ dataLength + "\r\n";outStream.write(contentlength.getBytes());String alive = "Connection: Keep-Alive\r\n";outStream.write(alive.getBytes());String host = "Host: "+ url.getHost() +":"+ port +"\r\n";outStream.write(host.getBytes());//写完HTTP请求头后根据HTTP协议再写⼀个回车换⾏outStream.write("\r\n".getBytes());//把所有⽂本类型的实体数据发送出来outStream.write(textEntity.toString().getBytes());//把所有⽂件类型的实体数据发送出来for(FormFile uploadFile : files){StringBuilder fileEntity = new StringBuilder();fileEntity.append("--");fileEntity.append(BOUNDARY);fileEntity.append("\r\n");fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");outStream.write(fileEntity.toString().getBytes());if(uploadFile.getInStream()!=null){byte[] buffer = new byte[1024];int len = 0;while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){outStream.write(buffer, 0, len);}uploadFile.getInStream().close();}else{outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);}outStream.write("\r\n".getBytes());}//下⾯发送数据结束标志,表⽰数据已经结束outStream.write(endline.getBytes());BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败return false;}outStream.flush();outStream.close();reader.close();socket.close();return true;}/*** 提交数据到服务器* @param path 上传路径(注:避免使⽤localhost或127.0.0.1这样的路径测试,因为它会指向⼿机模拟器,你可以使⽤或http://192.168.1.10:8080这样的路径测试)* @param params 请求参数 key为参数名,value为参数值* @param file 上传⽂件*/public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{return post(path, params, new FormFile[]{file});}}4)、新建MainActivity类,实现每隔5秒上传⼀次package com.ljq.activity;import java.io.File;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.util.Log;import com.ljq.utils.FormFile;import com.ljq.utils.SocketHttpRequester;public class MainActivity extends Activity {private File file;private Handler handler;private static final String TAG="MainActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);Log.i(TAG, "onCreate");file = new File(Environment.getExternalStorageDirectory(), "123.rmvb");Log.i(TAG, "照⽚⽂件是否存在:"+file);handler=new Handler();handler.post(runnable);}Runnable runnable=new Runnable() {public void run() {Log.i(TAG, "runnable run");uploadFile(file);handler.postDelayed(runnable, 5000);}};/*** 上传图⽚到服务器** @param imageFile 包含路径*/public void uploadFile(File imageFile) {Log.i(TAG, "upload start");try {String requestUrl = "http://192.168.1.101:8083/upload/upload/execute.do";//请求普通信息Map<String, String> params = new HashMap<String, String>();params.put("username", "张三");params.put("pwd", "zhangsan");params.put("age", "21");params.put("fileName", imageFile.getName());//上传⽂件FormFile formfile = new FormFile(imageFile.getName(), imageFile, "image", "application/octet-stream"); SocketHttpRequester.post(requestUrl, params, formfile);Log.i(TAG, "upload success");} catch (Exception e) {Log.i(TAG, "upload error");e.printStackTrace();}Log.i(TAG, "upload end");}}5)、修改清单⽂件<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.ljq.activity"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application><uses-sdk android:minSdkVersion="4" /><uses-permission android:name="android.permission.INTERNET" /></manifest>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
黑马程序员安卓教程:Android 程序入门
Android 程序入门Hello World 的创建点击ADT左上角的File按钮,然后选择New,然后点击Android Application Project(如图1-18)开始Android工程的创建。
(或者鼠标右击,在弹出的快捷菜单中创建也可以)。
图1-18 Android工程的创建弹出如图1-19向导界面1。
Application Name是应用的名字,该名字会显示在Android操作系统桌面图标下方,比如QQ、微信这样的文字。
Project Name是工程名称,该名称是Eclipse工程的名称,与Android应用程序没有太大的关系。
Package Name是包名,一个包名代表了唯一一个Android应用,在Android操作系统中是通过包名管理应用程序的。
Minimum Required SDK是指该应用最低兼容版本。
Target SDK是目标版本,也就是说我们创建的这个Android工程是针对哪个Android版本开发的。
Compile With是编译器版本,每个Android版本都有对应的编译器,建议使用跟Target SDK相同的编译器。
Theme是给应用选择主题,不同的主题会让应用显示出不同的样式。
以上各个配置设置好以后,点击Next...。
15图 1-19 创建 Android 工程向导界面 1图 1-20创建 Android 工程向导界面 2如图 1-20 所示,该界面展示了是否创建图标,是否创建 activity ,是否将该工程作为库工程,是否将该工程添加到当前工作空间,是否将该工程添加到指定工作集等信息,通常情况下不需要我们修改默认的配置,直接 Next 就行。
16图1-21创建Android工程向导界面 3 如图1-21所示,该界面提供了配置图标选项,我们通过点击Browser按钮可以选择我们个性化的图标。
在学习阶段不需要使用,然后点击Next...。
图1-22创建Android工程向导界面 4 如图1-22所示,该向导界面可以让我们选择创建一个什么样式的Activity,一般使用系统默认的BlankActivity 即可,然后点击Next...。
黑马程序员安卓教程:服务和进程的简介
服务和进程的几个相关概念1.服务的简介服务的概念最早是由微软提出来的,它可以理解为:有那么一类应用程序,能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了。
在Windows系统下:服务就是没有界面长期运行在后台的程序。
开始→控制面板→管理工具→服务,便能打开服务的管理页面,如图1-1所示:图1-1所示图1-1即是在Windows系统下后台服务列表,我们可以手动的开启,暂停一个服务。
在Android系统下:服务作为应用程序的一个组件,可以理解为长期后台运行的没有界面的Activity。
2.进程的简介进程的概念是60年代初由麻省理工学院MULTICS系统和IBM公司的CTSS/360系统引入的。
进程的定义有多种,但我们务必知道的是:进程是操作系统中运行的程序,它是操作系统资源管理的最小单位。
进程是一个活动的实体,它不同于应用程序而是程序的一次执行过程。
3.应用程序的简介应用程序是指令的集合。
其本身没有任何运行的含义,是一个静态的概念。
程序可以作为一种软件资料长期存在。
启动模拟器,在DDMS的devices视图中可以看到运行在该模拟器上的所有进程,当手动打开模拟器桌面上的某一个应用时,可以看到devices进程列表中就会添加一条数据记录,效果如图1-2所示。
打开桌面上“省电助手”,devices便新增一条进程记录开启新的进程图1-2所示图1-2可知:当开启一个应用程序时,进程列表中便添加一条对应的进程记录。
点击“BACK”按键,退出当前打开的应用,效果如图1-3所示:手”,devices列变图1-3所示图1-3可知:当点击“BACk”退出某一个应用时,这个应用所对应的进程仍然存在与于系统的进程列表中并没有被杀死。
通过以上操作,我们可以得出如下结论:应用程序退出只代表任务栈清空了,但操作系统仍会保留该应用程序的进程。
黑马程序员安卓教程:使用 HttpClient 提交数据(一)
使用HttpClient提交数据(一)HttpClient 是Apache Jakarta Common 下的子项目,提供了高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP协议最新的版本。
HttpClient 被内置到Android SDK 中,因此可以在不添加任何额外jar 包情况下,直接使用。
1.3.1get 方式提交在1.2 节工程的基础上,只需要修改部分代码即可。
因此这里只给出核心代码。
【文件1-5】get方式提交数据代码片段1./**2.* HttpCLient使用get方式完成用户的登录3.*4.* @param view5.*/6.public void login3(View view){7.// 获取用户数据8.final String username= et_username.getText().toString().trim();119.final String password= et_password.getText().toString().trim();10.// 校验数据11.if (TextUtils.isEmpty(password) ||TextUtils.isEmpty(username)){12.Toast.makeText(this, "用户名或密码不能为空!",Toast.LENGTH_SHORT).show();13.return;14.}15.// 开启子线程16.new Thread(new Runnable(){17.18.@Override19.public void run() {20.String path=21."http://10.0.2.2:8080/userlogin/servlet/LoginServlet?username="22.+ URLEncoder.encode(username) +"&password=" +password;23.try{24. // 创建一个httpClient 对象25. HttpClient client = new DefaultHttpClient();26. // 创建一个请求方式27. HttpGet request = new HttpGet(path);28. // 执行操作29. HttpResponse response = client.execute(request);30. // 获取放回状态对象31. StatusLine statusLine = response.getStatusLine();32. // 获取状态码33. int statusCode =statusLine.getStatusCode();34. if (200 == statusCode) {35. // 获取服务器返回的对象36. HttpEntity entity = response.getEntity();37. // 获取输入流38. InputStream inputStream = entity.getContent();39. // 将输入流转化为字符串40. String data = StreamUtils.inputStream2String(inputStream);41. handler.obtainMessage(RESULT_OK, data).sendToTarget();42. } else {43. handler.obtainMessage(RESULT_CANCELED, statusCode).sendToTarget();44. }45.46.}catch (Exception e) {47. e.printStackTrace();48. handler.obtainMessage(RESULT_CANCELED, e).sendToTarget();50.}51.}).start();52.}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件上传之服务端
Android开发中,我们常常需要上传文件到服务器,例如上传图片到互联网,上传数据备份到服务器等。
如何上传文件数据,下面我们通过一个案例来讲述文件上传的步骤。
首先我们需要编写上传图片的服务端,用来接收客户端上传过来的数据。
1.新建servlet
在web项目下新建一个Servlet,命名为UploadServlert,如图1-1所示:
图1-1所示
2.编写servlet
新建servlet使之继承HttpServlet,在生成的UploadServlet类中编写doGet方法或者doPost方法,下面我们编写doPost方法,代码如例1-1:
例1-1
3.编写jsp页面
新建一个jsp页面,用来访问服务端,查看该服务端代码是否编写成功。
Jsp页面代码如例1-2:
例1-2
<br>
启动Tomcat,部署服务端程序,在浏览器访问服务端,如图1-2所示:
图1-2所示
使用httpwatch抓取数据流,如图1-3所示:
图1-3所示
图1-3抓取的是一个post请求的数据流,该请求操作的请求报文如图1-4所示:
图1-4所示
由图1-4可知发送http请求上传文件的过程:在发送http请求数据时我们需要编写多种请求头,在上传请求体时我们用了拼接的方法将整个数据流上传到服务端。
若要使用HttpUrlConnection来完成上传文件的操作,需要编写大量的工作而且很容易出错。
为此,我们可以继续使用开源框架AsyncHttpClient来完成文件上传的需求。