相关链接

form表单提交multipart/form-data的请求分析:http://blog.csdn.net/five3/article/details/7181521、http://blog.csdn.net/MSPinyin/article/details/6141638
stack overflow上的某菌对Blob的发文(启发的我):http://stackoverflow.com/questions/8760133/how-can-i-specify-a-different-attachments-path-under-play-framework
w3对form提交post请求的demo:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4
4种常见的post提交数据的方式:https://www.imququ.com/post/four-ways-to-post-data-in-http.html
在MDN文档上解释的Blob:https://developer.mozilla.org/en-US/docs/Web/API/Blob

play!默认的application.conf文件中提供了这么一个配置项,今天稍微研究了下这个字段的用法。

# Store path for Blob content
attachments.path=data/attachments

1. Blob概念
简单理解下:Blob是一类像文件一样不可改变的原始数据。它不是JavaScript的基本数据类型。File接口是基于并扩展Blob实现的。
2. play!中的使用
play!中有这么一个play.db.jpa.Blob的数据类型。里面封装了一些基本的操作,其中有个getStore方法。
如果想要自定义attachments.path,推荐自己写一个类继承play.db.jpa.Blob,并重写(Overriding)getStore方法。

    public static File getStore() {
String name = Play.configuration.getProperty("attachments.path", "attachments");
File store = null;
if(new File(name).isAbsolute()) {
store = new File(name);
} else {
store = Play.getFile(name);
}
if(!store.exists()) {
store.mkdirs();
}
return store;
}

3. 结合下面的例子,讲下使用方法。
1) 前台

<form enctype="multipart/form-data" method="post" action="@{AdminController.upload()}">
<input type="file" name="file1”/>
<input type="text" name="file1Name"/>
<input type="submit" value="send"/>
</form>

2) 后台

public static void upload(Blob file1, String file1Name) {// 当然,一般情况下我们使用的是File类型
System.err.println(file1.getFile().getPath());
}

3) 运行,控制台输出如下。Finder里的确生成了这么个文件

/Users/apple/dev/workspace/workspace_git/weshop/data/attachments/497fa3c5-9b57-4b78-b156-d566ac52b19a

4) Chrome调试模式的Network请求分析如下(截图见文章最后)。主要看下面2个部分:
a) 请求头:定义请求的Content-Type以及请求体中的分隔符boundary

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvah0TCfvWzqIistq

b) 请求体:以自定义的boundary来分隔form中定义的一个个参数,以此形式来构造请求体(每次都是—${boundary}+换行+数据描述+最后用—${boundary}--结束)

------WebKitFormBoundaryvah0TCfvWzqIistq
Content-Disposition: form-data; name="file1"; filename="avatar69624_3.gif"
Content-Type: image/gif ------WebKitFormBoundaryvah0TCfvWzqIistq
Content-Disposition: form-data; name="file1Name" 我的头像
------WebKitFormBoundaryvah0TCfvWzqIistq———

本地Finder中上传成功的文件路径(我的配置文件中定义attachments.path=data/attachments):

关于play!的attachments.path配置、以及关于Form表单上传请求的认识的更多相关文章

  1. PHP 后台程序配置config文件,及form表单上传文件

    一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...

  2. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  3. [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

    原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的. ...

  4. 配置php.ini实现PHP文件上传功能

    本文介绍了如何配置php.ini实现PHP文件上传功能.其中涉及到php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项,这些 ...

  5. Maven配置jar(war)包自动打包上传Maven服务器的配置

    Maven配置jar(war)包自动打包上传Maven服务器的配置 创建jar(war)包工程 创建一个maven工程 在工程中穿件一个测试类 配置pom.xml <distributionMa ...

  6. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

  7. vue3 element-plus 配置json快速生成form表单组件,提升生产力近600%(已在公司使用,持续优化中)

    ️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...

  8. springmvc笔记(基本配置,核心文件,路径,参数,文件上传,json整合)

    首先导入jar包 大家注意一下我的springmvc,jackson,common-up的jar包版本.其他版本有可能出现不兼容. src文件: webroot目录: web.xml <?xml ...

  9. 移动商城第四篇【Controller配置、添加品牌之文件上传和数据校验】

    Controller层配置 编写SpringMVC的配置文件 springmvc.xml <?xml version="1.0" encoding="UTF-8&q ...

随机推荐

  1. php特级课---1、网站大访问量如何解决

    php特级课---1.网站大访问量如何解决 一.总结 一句话总结: 负载均衡和冗余技术 1.负载均衡和冗余技术是一回事么? 并不是:负载均衡是用户分流:冗余技术是避免出现单点故障 负载均衡:将不同的用 ...

  2. WCF实现REST服务

    REST 表述性状态转移(Representational State Transfer,REST),不是一种标准,而是一种软件架构风格. 基于REST的服务与基于SOAP的服务相比,性能.效率和易用 ...

  3. cassandra cqlsh 和 python客户端

    Keyspaces A cluster is a container for keyspaces. A keyspace is the outermost container for data in ...

  4. Oracle常见的33个等待事件

    Buffer busy waits 原因:        当一个会话试图修改一个数据块,但这个数据块正在被另一个会话修改时.        当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读 ...

  5. rabbitmq_学习_01_rabbitmq安装

    二.参考资料 1.RabbitMQ:windows10下安装 2.RabbitMQ系列(一):Windows下RabbitMQ安装及入门

  6. LeetCode OJ:Validate Binary Search Tree(合法的二叉搜索树)

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  7. dilworth定理的通俗讲解

    度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两 ...

  8. OpenCV 2.4.9 +VS2013 开发环境配置

    OpenCV 的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac O ...

  9. AtCoder Petrozavodsk Contest 001 A - Two Integers

    Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are given positive ...

  10. django的get_or_create

    转:http://www.nanerbang.com/article/51/ get_or_create会根据条件从数据库里面查找符合条件的记录,如果没有符合条件的记录,则新创建一条记录