Uploadfile.docx_第1页
Uploadfile.docx_第2页
Uploadfile.docx_第3页
Uploadfile.docx_第4页
Uploadfile.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

源代码package net.blogjava.mobile;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import net.blogjava.mobile.widget.FileBrowser;import net.blogjava.mobile.widget.OnFileBrowserListener;import android.app.Activity;import android.os.Bundle;import android.widget.Toast;public class Main extends Activity implements OnFileBrowserListenerOverridepublic void onDirItemClick(String path)Overridepublic void onFileItemClick(String filename)/ 00是本地PC的IP地址String uploadUrl = 00:8080/upload/UploadServlet;String end = rn;String twoHyphens = -; / 两个连字符String boundary = *; / 分界符的字符串tryURL url = new URL(uploadUrl);HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection(); / 要想使用InputStream和OutputStream,必须使用下面两行代码httpURLConnection.setDoInput(true);httpURLConnection.setDoOutput(true);httpURLConnection.setUseCaches(false);/ 设置HTTP请求方法,方法名必须大写,例如,GET、POSThttpURLConnection.setRequestMethod(POST);httpURLConnection.setRequestProperty(Connection, Keep-Alive);httpURLConnection.setRequestProperty(Charset, UTF-8); / 必须在Content-Type请求头中指定分界符中的任意字符串httpURLConnection.setRequestProperty(Content-Type,multipart/form-data;boundary= + boundary);/ 获得OutputSream对象,准备上传文件 DataOutputStream dos=new DataOutputStream(httpURLConnection. getOutputStream();/ 设置分界符,加end表示为单独一行dos.writeBytes(twoHyphens + boundary + end);/ 设置与上传文件相关的信息dos.writeBytes(Content-Disposition: form-data; name=file; filename=+ filename.substring(filename.lastIndexOf(/) + 1)+ + end);/ 在上传文件信息与文件内容之间必须有一个空行dos.writeBytes(end);/ 开始上传文件FileInputStream fis = new FileInputStream(filename);byte buffer = new byte8192; / 8kint count = 0;/ 读取文件内容,并写入OutputStream对象while (count = fis.read(buffer) != -1)dos.write(buffer, 0, count);fis.close();/ 新起一行dos.writeBytes(end);/ 设置结束符号(在分界符后面加两个连字符)dos.writeBytes(twoHyphens + boundary + twoHyphens + end);dos.flush();/开始读取从服务器端传过来的信息InputStream is = httpURLConnection.getInputStream();InputStreamReader isr = new InputStreamReader(is, utf-8);BufferedReader br = new BufferedReader(isr);String result = br.readLine();Toast.makeText(this, result, Toast.LENGTH_LONG).show();dos.close();is.close();catch (Exception e)setTitle(e.getMessage();Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);FileBrowser fileBrowser = (FileBrowser) findViewById(R.id.filebrowser);fileBrowser.setOnFileBrowserListener(this);Uploadfile将手机上的文件上传到服务器端。服务器端程序在upload目录中,直接将目录复制到webapps目录中,启动Tomcat,负责接收客户端上传的文件,并将成功上传的文件保存到D:UPLOAD目录中。使用HttpURLConnection类访问HTTP资源使用以下几步:1) 使用.URL封装HTTP资源的url,并使用openConnection方法获得HttpUrlConnection对象,代码如下:URL url = new URL(uploadUrl);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();2) 设置请求方法,例如GET、POST等,代码如下:httpURLConnection.setRequestMethod(POST);3) 设置输入输出及其他权限。如果要下载HTTP资源或向服务器上传数据,需要使用如下代码进行设置:/ 下载HTTP资源,需要将setDoInput方法的参数值设为truehttpURLConnection.setDoInput(true);/ 上传数据,需要将setDoOutput方法的参数值设为truehttpURLConnection.setDoOutput(true);httpURLConnection类还包含更多的项,例如,使用下面的代码可以禁止httpURLConnection使用缓存。httpURLConnection.setUseCaches(false);4) 设置HTTP请求头。在很多情况下,要根据实际情况设置一些HTTP请求头,例如下面的代码设置Charset请求头的值为UTF-8。httpURLConnection.setRequestProperty(Charset, UTF-8);5) 输入和输出数据。这一步是对HTTP资源的读写操作。也就是通过InputStream和OutputStream读取和写入数据。下面的代码获得InputStream对象和OutputStream对象OutputStream dos= httpURLConnection. getOutputStream();InputStream fis = httpURLConnection. getIntputStream();6) 关闭输入输出流。虽然关闭输入输出流并不是必需的,在应用程序结束后,输入输出流会自动关闭,但显式输入输出流是一个好习惯。关闭输入输出流的代码如下:dos.close();fis.close();DataOutputStream类使用public final void writeBytes(String s)作为写入字符串的方法:public final void writeBytes(String s) /由于JAVA的字符编码是Unicode的,第1个字符占两个字节,writeBytes方法只是将每个字符的低字节写入到目标设备中。InputStream类使用FileInputStream 用于从文件读取信息 代表文件名的一个String,或者一个File或FileDescriptor对象作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口。fis.read(buffer) 从此输入流中将最多 buffer.length 个字节的数据读入一个 byte 数组中。Main.java中使用了FileBrowser函数接口(P138实例36:SD卡文件浏览器),其实现的基本步骤如下:1) 显示当前目录中所有的子目录和文件,并将目录和文件名显示在ListView中。2) 当单击某一个列表项时,如果当前列表项是目录,则进入该目录,并重复第1步。如果当前列表项是文件,则作进一步处理。在FileBrowser类中定义了如下4个变量:l folderImageResId:保存标签的folderImage属性值,表示显示在目录列表项前面的图像资源的ID。l otherFileImageResId:保存标签的otherFileImage属性值,表示未设置图像资源的文件列表前面显示的默认图像资源的ID。l fileImageResIdMap:该变量保存的并不是标签中的某个属性值,而是0n个属性的值。fileImageResIdMap是一个Map类型的变量,表示所有通过扩展名设置的文件列表项前面显示的图像资源的ID。Key表示文件扩展名,例如jpg,txt等。Vaule表示该扩展名对应的图像资源ID。l onlyFolder:保存标签的onlyFolder属性值。如果将该属性设为true,FileBrowser组件将不会显示当前目录中的文件列表。默认值是false。4步完成FileBrowser组件:1) 在FileBrowser组件装载时,会显示SD卡根目录中所有的子目录和文件名(如果将onlyFolder属性设为true,则不显示文件名)。这些代码需要在FileBrowser类的构造方法中执行,如下:dirStack.push(sdcardDirectory);addFiles();dirStack是FileBrowser类中定义的一个Stack类型变量,用于分段保存当前目录。例如,当前目录时/sdcard/xyz/abc,则将/sdcard首先压入栈,然后将xyz压入栈,栈顶是abc。当退回/sdcard/xyz时会弹出栈顶元素(abc)。这样从栈底开始扫描,就可以获得当前目录。addFiles扫描当前目录,并将当前目录的File对象集合添加到fileList变量中,该变量是在FileBrowser类中定义的一个List类型变量,用于保存当前目录中所有的File对象(每个File对象表示目录或文件)。addFiles代码如下:private void addFiles()fileList.clear();String currentPath = getCurrentPath(); /获得当前路径File files = new File(currentPath).listFiles();/获得当前目录中所有的File对象/ 当前不是根目录,使fileList变量的第1个元素为null,如果元素为null,会显示”.”/ 单击该列表项,会返回上一级目录if (dirStack.size() 1)fileList.add(null);for (File file : files) /只添加表示目录的File对象if (onlyFolder)if (file.isDirectory()fileList.add(file);elsefileList.add(file);在addFiles方法中使用了一个getCurrentPath方法,根据dirStack变量获得当前的完整性目录,代码如下:private String getCurrentPath()String path = ;for (String dir : dirStack)path += dir + /;path = path.substring(0, path.length() - 1);return path;getCurrentPath方法返回一个不以”/”结尾的完整路径,例如/sdcard/xyz/abc。2) FileBrowser类中的属性变量fileImageResIdMap对应两组标签中的属性。设置多个文件扩展名的图像资源ID需要设置mobile:extNameN和mobile:fieImageN属性,其中N是从1开始的整数,中间不能断档,N必须是连续的。为了读取这样的动态属性,代码如下:int index = 1;while (true)String extName = attrs.getAttributeValue(namespace, extName+ index);int fileImageResId = attrs.getAttributeResourceValue(namespace,fileImage + index, 0);if (.equals(extName) | extName = null | fileImageResId = 0)break;fileImageResIdMap.put(extName, fileImageResId);index+;3) 在FileBrowser组件中仍然使用自定义的Adapter对象为ListView提供数据。在FileBrowser类中定义的Adapter类是FileListAdapter。FileListAdapter类的getView方法中返回了一个LinearLayout对象。该对象中有一个ImageView和一个TextView对象。ImageView用于显示通过标签的属性指定的图像。TextView用于显示目录或文件名。只是设置TextView的值时要注意,当fileList的元素为null时(fileList的第1个元素),TextView中显示的文本是”.”。4) 当单击目录或文件列表项时,会根据具体的情况进行处理,代码如下:public void onItemClick(AdapterView parent, View view, int position, long id) / fileList元素的值为null,相当于ListView中的列表项的值是”.”,返回上一级目录if (fileList.get(position) = null)dirStack.pop(); /将最上一层目录出栈addFiles(); /重新获得当前目录中的子目录和文件的File对象/通知FileListAdapter对象数据已经变化,重新刷新列表fileListAdapter.notifyDataSetChanged();/如果设置了FileBrowser事件,则调用onDirItemClick方法,表示当前目录被单击if (onFileBrowserListen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论