以Base64字符串形式上传文件——服务器端Java/Servlet接受请求数据中的字符串内容并转换成文件
来源:互联网 发布:欧奈尔选股公式源码 编辑:程序博客网 时间:2024/06/08 21:07
简述
在常规的web开发过程中,大部分上传文件都是在web页面端通过表单直接提交,再由服务器端捕获请求来进行处理的。但是在前后端分离趋于一种流行趋势,再加上Android和iOS开发技术日渐成熟,大部分团队都会选择在服务器端仅提供一套通用的webservice数据接口,而web页面、Android和iOS统一都通过这套数据接口来向服务器发送请求和获取数据。
在这一过程中,大部分的webservice数据接口都会采用xml数据格式或是json数据格式来进行数据请求和处理,在这种情况下,其实来自客户端的请求就可以看作是一个字符串(无论是xml还是json数据)。此时,常规的数据提交完全不存在任何问题,但是附件上传就需要特殊处理了。
本文简单介绍了如何以字符串形式上传文件,并重点介绍了在服务器端如何进行相关处理,并给出了部分示例代码。
一、接受request请求,并处理(Java语言)
由于我们采用整段字符串(xml或json格式)的形式从客户端提交请求,因此如果仍然用“名值对”的方式来接受请求看起来就有点愚蠢。所谓的“名值对”就是每一个参数有是“参数名=参数值”的形式,例如下面这样:
id = 00001name = xiuli
在这种方式下,传统的web页面的表单是类似这样的:
<form><input type="hidden" name="id" value="00001"/><input type="text" name="name" value="xiuli"/></form>
String id = request.getParameter(id);String name = request.getParameter(name);//...这么一来,就意味着我们不能在客户端直接提交我们的xml数据或是json数据,而是必须为数据在增加一个“参数名”,确实很多此一举。
所以,我们采用数据流的形式来进行数据请求和服务器端接受。在这种方式下,服务器接受到的数据直接就是参数的“值”,完全没有“名”这一说:
InputStream requestInputStream = request.getInputStream();而通过下面这句代码能够获得整个流的长度:
int lengthOfContent = request.getContentLength();有了长度,我们就很容易判断客户端是否有正确地提交了参数,如果长度是0的话,就说明一定是哪里出问题了。
而有了输入流,就可以用下面的方法来将流中的内容转换为字符串了:
/** * 将inputstream输入流转换成字符串 * @Title: convertStreamToString * @author freezingxu * @date 2015-2-3 下午1:37:29 * @param is:inputstream输入流 * @param charSet:字符编码格式 * @param lengthOfContent:输入流的长度 * @return String * @throws Exception */public static String convertStreamToString(InputStream is,String charSet,int lengthOfContent) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[lengthOfContent]; int count = -1; while((count = is.read(data,0,lengthOfContent)) != -1) outStream.write(data, 0, count); data = null; return new String(outStream.toByteArray(),charSet); }
这么一来,我们就从request对象中取到了字符串形式的文件内容,接下来就是将字符串转换回文件的形式了。
二、字符串与文件互相转换
因为我们需要将字符串Base64化,所以需要import以下包:
import sun.misc.BASE64Encoder;
来看如何将字符串恢复成文件,需要注意的是,方法入参列表中的第二个入参“filePath”,包含了完整的文件保存路径,包括文件名和后缀名:
public static boolean str2File(String fileStr,String filePath){//if (fileStr == null) //文件数据为空return false;try {//Base64解码byte[] b = Base64.decodeBase64(fileStr);for(int i=0;i<b.length;++i){if(b[i]<0){//调整异常数据b[i]+=256;}}//生成文件,并保存在服务器硬盘上OutputStream out = new FileOutputStream(filePath); out.write(b);out.flush();out.close();return true;} catch (Exception e) {e.printStackTrace();return false;}}
再来看如何将文件转换为字符串:
public static String file2Str(String file){//将文件转化为字节数组字符串,并对其进行Base64编码处理InputStream in = null;byte[] data = null;//读取文件字节数组try{in = new FileInputStream(file); data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}return new String(Base64.encodeBase64(data));}
好了,服务器端的处理就这么简单,到此结束。
阅读全文
0 0
- 以Base64字符串形式上传文件——服务器端Java/Servlet接受请求数据中的字符串内容并转换成文件
- 安卓开发:以Base64字符串形式上传文件——从Android选择文件并上传
- 基于Swift的iOS应用程序开发:以Base64字符串形式上传文件——从iOS选择文件并上传
- 以Base64字符串形式上传文件——在web浏览器端使用原生Javascript及Ajax读取本地文件并发送请求到服务器
- Java读取文件内容与字符串保存成文件的操作
- 在 Java 中把 .NET 使用 Convert.ToBase64String 转换出的 Base64 字符串还原成文字
- 在 Java 中把 .NET 使用 Convert.ToBase64String 转换出的 Base64 字符串还原成文字
- Java读取文件内容并转换为字符串
- Java读取文件内容并转换为字符串
- Java读取文件内容并转换为字符串
- 用base64编码的字符串形式上传图片,并实时更新上传的进度条
- 数据持久化的本质 - 数据保存成文件,存储到程序的沙盒中 -在应用程序结束时,将内存中的数据以文件的形式搬到(保存到)硬盘中
- (写文件)将字符串保存成文件
- Java实现base64图片转换为base64字符串。base64字符串转换图片 之间的互相转换,并保存在本地。
- 将上传文件以二进制形式存入数据库中,并下载数据库中的二进制数据生成对应的文件
- 华为: 识别字符串中的整数并转换为数字形式
- 识别字符串中的整数并转换为数字形式
- 识别字符串中的整数并转换为数字形式
- ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法
- php字符串数组相互转换
- 图的遍历(下)——邻接表
- java异常
- 如何查看linux版本信息
- 以Base64字符串形式上传文件——服务器端Java/Servlet接受请求数据中的字符串内容并转换成文件
- 1051. 复数乘法 (15)
- HTML5的基本结构
- Leetcode352——Data Stream as Disjoint Intervals
- 1008.Gnome Tetravex
- Nginx 教程二:利用nginx搭建静态文件服务、正向代理服务器、反向代理服务器
- 解决办法:CMake编译时出现“error in configuration process project files may be invalid”
- Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
- 博客开篇