简述

在常规的web开发过程中,大部分上传文件都是在web页面端通过表单直接提交,再由服务器端捕获请求来进行处理的。但是在前后端分离趋于一种流行趋势,再加上Android和iOS开发技术日渐成熟,大部分团队都会选择在服务器端仅提供一套通用的webservice数据接口,而web页面、Android和iOS统一都通过这套数据接口来向服务器发送请求和获取数据。
在这一过程中,大部分的webservice数据接口都会采用xml数据格式或是json数据格式来进行数据请求和处理,在这种情况下,其实来自客户端的请求就可以看作是一个字符串(无论是xml还是json数据)。此时,常规的数据提交完全不存在任何问题,但是附件上传就需要特殊处理了。
本文简单介绍了如何以字符串形式上传文件,并重点介绍了在服务器端如何进行相关处理,并给出了部分示例代码。

一、接受request请求,并处理(Java语言)

由于我们采用整段字符串(xml或json格式)的形式从客户端提交请求,因此如果仍然用“名值对”的方式来接受请求看起来就有点愚蠢。所谓的“名值对”就是每一个参数有是“参数名=参数值”的形式,例如下面这样:
id = 00001
name = xiuli
在这种方式下,传统的web页面的表单是类似这样的:
<form><input type="hidden" name="id" value="00001"/><input type="text" name="name" value="xiuli"/>
</form>

对应的,传统的Java/Servlet是使用下面这种经典方式来接收“名值对”形式的请求参数的:

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));
}

好了,服务器端的处理就这么简单,到此结束。

以Base64字符串形式上传文件——服务器端Java/Servlet接受请求数据中的字符串内容并转换成文件相关推荐

  1. 上接稳扎稳打Silverlight(20) - 2.0通信之WebClient, 以字符串的形式上传/下载数据

    2.以字符串的形式和流的形式上传数据 REST.cs(WCF创建的用于演示以字符串的形式和流的形式上传数据的REST服务) using System;  using System.Linq;  usi ...

  2. java0到9的字符怎么表示_java,_java 怎么生成一个0-9,a-z的一个44位字符串作为上传文件的名字,java - phpStudy...

    java 怎么生成一个0-9,a-z的一个44位字符串作为上传文件的名字 找到一个时间MD5加密的 package org.blog.controller; import java.io.File; ...

  3. SMW0 HTML模版的形式上传文件 维护MIME类型

    使用SMW0事务代码为webrfc上传模版, 若是已HTML模版形式上传的话,所上传的文件类型必须在MIMETYPES表中有对应的MIMETYPES,如果没有对应的,则应该维护进去,否则不允许以HTM ...

  4. 使用Ajax以一种形式上传数据和文件吗?

    本文翻译自:Uploading both data and files in one form using Ajax? I'm using jQuery and Ajax for my forms t ...

  5. Java获取流形式上传下载文件

    废话不多说,直接上代码: 1:pom中添加一下依赖: <!--druid数据源--><dependency><groupId>com.alibaba</gro ...

  6. 将base64编码图片上传到七牛云

    将base64编码图片上传到七牛云 接口说明 FAQ >对象存储 >上传下载> 如何上传base64编码图片到七牛云 在七牛云FAQ上有一篇文章,讲解的接口的使用 https://d ...

  7. 文件上传漏洞实验-通过截取http请求绕过前端javascript验证进行文件上传

    1.什么是文件上传漏洞 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效的,部分文件上传漏洞 ...

  8. jq 编码 php解码,jQuery编码转化base64通过AJAX上传

    这次给大家带来jQuery编码转化base64通过AJAX上传,jQuery编码转化base64通过AJAX上传的注意事项有哪些,下面就是实战案例,一起来看一下. 本文实例讲述了jQuery实现文件编 ...

  9. 网页扫描图像并以pdf格式上传到服务器端

    本文描述如何通过网页驱动扫描仪.高拍仪等图像扫描设备进行图像扫描,扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存. 图像扫描上传如文字描述顺序所介绍,先要驱动扫描设备 ...

最新文章

  1. 第八课.简单的图像分类(二)
  2. [Javascript]怎么样让公告不间断的滚动显示
  3. 东北师范大学计算机科学与技术学科评估,东北的大学最强十校,工科是真强,2所211大学无缘前十...
  4. MinHook - 最小化的 x86/x64 API 钩子库
  5. linux java mysql 备份 runtime_Linux下mysql定时备份脚本以及java实现
  6. ubuntu java 编译器_Ubuntu 16.04配置Java开发环境
  7. String、StringBuffer比较
  8. php domdocument getelementbyid,PHP DOMDocument- getElementByID添加Â代替空
  9. MYSQL 编码设置
  10. 直播丨国产最强音:HTAP融合型分布式数据库EsgynDB架构详解
  11. 单反相机的常用的几个参数之间的关系
  12. [leetcode]5325. 包含所有三种字符的子字符串数目
  13. eclipse中文版
  14. 舒尔特 Pro ,专业训练注意力专注力
  15. 修改el-input叉号的样式
  16. Android添加拍照功能,Android开发实现拍照功能的方法实例解析
  17. Linux之创建组名和删除组名
  18. 美团html页面代码,html+css+js制作美团官网
  19. centos7 安装docker-ce社区版 ,最新版本docker,docker阿里云加速
  20. 【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系

热门文章

  1. 计算机四级英语翻译,英语四级考试翻译技巧
  2. 初识Photoshop CS6
  3. 秦始皇焚书坑儒只因曾被算命先生忽悠?
  4. c语言中delay的用法。
  5. 结合泛函极值_泛函的极值
  6. 阿里云语音电话的sdk的调用实例
  7. spring中tx:advice/tx:advice是什么意思?作用是什么?谁能简单说下
  8. 2023 上半年软件设计师知识点复习总纲
  9. 应用程序无法正常启动(0xc0000142)。请单击“确定”关闭应用程序
  10. 表示自己从头开始的句子_形容从头开始的句子