说明

在HTML中上传文件时会为文件内容加入一头一尾,如下所示:

-----------------------8cc0b8cfcfd5ed2
Content-Disposition: form-data; name="file"; filename="item3.xml"
Content-Type: application/octet-stream这里是真正的文件内容
-----------------------8cc0b8cfcfd5ed2--

因此服务端接收后要手动对其作解析。

代码

网页端

<!DOCTYPE HTML>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf8" /><meta http-equiv="pragma" content="no-cache" /><title>测试页</title>
</head><body>文件上传页<form action="http://localhost:4513/IVisitorRestService/Upload/utf-8" method="POST" enctype="multipart/form-data"><input type="file" /><input type="submit" /></form>
</body>
</html>

服务端

契约

/// <summary>
/// 使用HTML上传文件
/// </summary>
/// <param name="file">文件流</param>
/// <param name="encodingName">HTML的文字编码名</param>
[Custom(AllowAnonymousForOperation = true)]
[WebInvoke(Method = "POST", UriTemplate = "Upload/{encodingName}")]
void Upload(Stream file, string encodingName);

实现

public void Upload(Stream file, string encodingName)
{using (var ms = new MemoryStream()){file.CopyTo(ms);ms.Position = 0;var encoding = Encoding.GetEncoding(encodingName);var reader = new StreamReader(ms, encoding);var headerLength = 0L;//读取第一行var firstLine = reader.ReadLine();//计算偏移(字符串长度+回车换行2个字符)headerLength += encoding.GetBytes(firstLine).LongLength + 2;//读取第二行var secondLine = reader.ReadLine();//计算偏移(字符串长度+回车换行2个字符)headerLength += encoding.GetBytes(secondLine).LongLength + 2;//解析文件名var fileName = new System.Text.RegularExpressions.Regex("filename=\"(?<fn>.*)\"").Match(secondLine).Groups["fn"].Value;//一直读到空行为止while (true){//读取一行var line = reader.ReadLine();//若到头,则直接返回if (line == null)break;//若未到头,则计算偏移(字符串长度+回车换行2个字符)headerLength += encoding.GetBytes(line).LongLength + 2;if (line == "")break;}//设置偏移,以开始读取文件内容ms.Position = headerLength;减去末尾的字符串:“\r\n--\r\n”ms.SetLength(ms.Length - encoding.GetBytes(firstLine).LongLength - 3 * 2);using (var fileToupload = new FileStream("D:\\FileUpload\\" + fileName, FileMode.Create)){ms.CopyTo(fileToupload);fileToupload.Close();fileToupload.Dispose();}}
}

在HTML中使用WCF RESTful上传文件相关推荐

  1. 在jsp中使用smartupload组件上传文件- -

    在jsp中使用smartupload组件上传文件- - jsp对上传文件的支持不象php中支持的那么好,直接做成了函数,也不象asp中要通过组件才能实现.jsp中可以通过javabean来实现.但是我 ...

  2. 在 node 中使用 koa-multer 库上传文件详解

    本文主要介绍了上传单个文件.多个文件,文件数量大小限制.限制文件上传类型和对上传的图片进行不同大小的裁剪,阅读本篇文章需要具备一定的 node 和 koa 框架的基础知识以及 async await ...

  3. 修改form重定到iframe中,模拟异步上传文件的效果

    2019独角兽企业重金招聘Python工程师标准>>> <%@ page contentType="text/html; charset=GBK" lang ...

  4. part.write java_小白向:web中利用request.getPart()上传文件到服务器

    被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的"详"解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工 ...

  5. form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?

    今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...

  6. Vue之AntDesignVue之「a-upload」上传文件列表删除列表中的某个待上传文件时,出现预期想删除的文件与实际删除的文件不一致的问题

    这是官网的参考方法 于是参考此方法,采用beforeUpload 返回 false 后,手动上传文件的上传方法. 这是我的写法 <template>: js: @change remove ...

  7. asp.net fileupload 文件上传后服务器上找不到文件,Asp.net中FileUpload控件上传文件例子...

    FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles ...

  8. xshell文件传输乱码_在Xshell中使用rz命令上传文件出现乱码且文件无法删除的解决办法...

    有些时候,我们在使用rz命令上传文件失败或者不小心输入命令会产生乱码文件名,之后尝试使用rm 删除这些文件,无果:使用rm -rf强制删除,亦无果.是不是很好奇为什么如此强大的rm命令竟然删除不了这些 ...

  9. shell中通过ftp批量上传文件

    为了在shell中上传文件,需要避免在控制台中通过交互的方式输入ftp的登录密码,这时要安装一个强大的ftp命令行工具:lftp,通过lftp登录ftp服务器的格式如下: lftp -u userna ...

最新文章

  1. ajax发送动态字符传,如何发送ajax请求文件与其他字符串的变量?
  2. uniapp原生子窗体(弹出层为例子)
  3. Web 开发规范 — WSGI
  4. 手机html检测蓝牙打印机,打印机手机确认.html
  5. @Html.ValidationSummary()的使用
  6. JAVA进阶级开发之(Array工具类)
  7. Log4j、Log4j 2、JUL、JCL 、SFL4J 、Logback 与 Lombok 的使用
  8. Linux内核漏洞精准检测如何做?SCA工具不能只在软件层面
  9. Linux下Apache与Tomcat的完全分布式集群配置(负载均衡)
  10. 今天执行grep命令差点把服务器搞崩
  11. 交互式电子杂志_电子杂志形式与交互问题分析
  12. verilog语法进阶
  13. Beego 使用redigo连接redis
  14. marshmallow——自定义类型
  15. Linux 用终端运行网易云音乐
  16. python程序判断梅森素数_梅森素数的探索之旅
  17. 第一本Docker书pdf
  18. 什么是温度传感器?温度传感器原理是什么?一文带你全部搞懂
  19. LeetCode题解(1594):矩阵从左上移动到右下的最大非负积(Python)
  20. XXTEA 加解密算法的 Python 实现

热门文章

  1. centos6.5安装Chrome
  2. 怎么把一个Java应用打包成Docker镜像
  3. 解决方案:超卖(Redis原子队列)
  4. SpringBoot整合Redis缓存中间件
  5. maven中的module及聚合项目
  6. Kafka的高性能原理
  7. 正则基础之——非捕获组
  8. JavaScript中的call,apply,bind学习总结
  9. js获取用户在input标签中输入的值,然后改变html下各个标签的值或者属性
  10. 算法心得1:由$nlogn$复杂度的LIS算法引起的思考