一 说明
本章节讲解使用rop进行文件上传(图片) 暂时先引用文档的说明,因为文档已经说的很明白了
由于服务请求报文是一个文本,无法直接传送二进制的文件内容,因此必须采用某种
转换机制将二进制的文件内容转换为字符串。Rop 采用如下的方式对上传文件进行编码:
fileType@BASE64( 文件内容 )
fileType代表文件类型,文件内容采用 BASE64 算法进行编码,这样二进制的文件
内容就可以转换为一个字符串,两者“@”字符分隔。服务端接收到上传的文件后,即可
解析出文件的类型和文件的内容。
Rop 定义了一个 UploadFile,代表一个上传的文件,来看一下 UploadFile 的定义:
UploadFile.java
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">package</span> com.rop.request; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> com.rop.annotation.IgnoreSign; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> org.springframework.util.FileCopyUtils; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.File; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.IOException; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//①说明签名算法将忽略所有 UploadFile的参数数据的签名</span> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@IgnoreSign</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">UploadFile</span> {</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String fileType; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] content; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">UploadFile</span>(String fileType, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] content) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.content = content; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.fileType = fileType; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">UploadFile</span>(File file) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//说明签名算法将忽略所有 UploadFile</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//的参数数据的签名。</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//335</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Rop 开发手册 V1.0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.content = FileCopyUtils.copyToByteArray(file); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.fileType = file.getName().substring(file.getName().lastIndexOf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'.'</span>)+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IOException e) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(e); } } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">getFileType</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> fileType; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] <span class="hljs-title" style="box-sizing: border-box;">getContent</span>() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> content; } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul>
UploadFile 类定义处标注了@IgnoreSign 注解,这说明 Rop 的签名算法会忽略所有
UploadFile 属性。因此,客户端无须将上传文件的参数纳入到签名参数列表中。
Rop 定义了一个服务于 UploadFile 中的转换器: UploadFileConverter, Rop 已经在内部
注册了这个转换器,因此可以在 RopRequest 实现类中直接使用 UploadFile,Rop 会自动将
代表上传文件的格式化字符串参数正确绑定到 UploadFile 中。
文件上传实例
rop-sample 的 UserService 有一个用于上传用户头像的服务方法:
代码清单 27 UploadFile.java
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">@ServiceMethod(method = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"user.upload.photo"</span>, version = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1.0"</span>, httpAction = HttpAction<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.POST</span>) public Object uploadPhoto(UploadUserPhotoRequest request) throws Throwable { //①获取上传文件的类型和文件内容 String fileType = request<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getPhoto</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getFileType</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; </span> int length = request<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getPhoto</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getContent</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.length</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> ClassPathResource outFile = new ClassPathResource(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> //②将上传的文件保存到类路径下 FileCopyUtils<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.copy</span>(request<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getPhoto</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getContent</span>(), new File(outFile<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getFile</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getParent</span>()+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/1."</span> + fileType))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> UploadUserPhotoResponse response = new UploadUserPhotoResponse()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> response<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setFileType</span>(fileType)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> response<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setLength</span>(length)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> return response<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
在①处获取文件的类型和文件的内容,在②处将其保存到服务器的类路径下,最后返
回上传成功的响应。 uploadPhoto()服务方法的入参是 UploadUserPhotoRequest, 其代码如下
所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">UploadUserPhotoRequest</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">AbstractRopRequest</span> {</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String userId; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//①</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> UploadFile photo; … }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
photo 属性对应的类型即是 UploadFile,Rop 会自动将格式化的 photo 字符串请求参数
绑定到这个属性对象中。 下面是客户端调用 user.upload.photo#1.0 服务的测试方法, 它位于
UserServiceRawClient 类中:
代码清单 28 UserServiceRawClient.java:测试调用上传文件服务
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">@Test <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> testUploadUserPhoto() throws Throwable { RestTemplate restTemplate <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> RestTemplate(); MultiValueMap<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> form <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> LinkedMultiValueMap<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span>(); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"method"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"user.upload.photo"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"appKey"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"00001"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"v"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1.0"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sessionId"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mockSessionId1"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"locale"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"en"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"userId"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> sign <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> RopUtils<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sign(form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>toSingleValueMap(), <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"abcdeabcdeabcdeabcdeabcde"</span>); form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sign"</span>, sign); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果没有指定相对的类名,该类将从类的根路径开始寻找某个resource,如果指定了相对的类名,则根据指定类</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//的相对路径来查找某个resource。 </span> ClassPathResource resource <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> ClassPathResource(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"photo.png"</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//方法二 直接new一个File 列如:File file = new File("E://333.jpg"); </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//UploadFile uploadFile = new UploadFile(file);这样也可以 </span> UploadFile uploadFile <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> UploadFile(resource<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getFile());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ①构造一个上传文件对象</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ②添加一个上传的文件, photo 参数不参与签名 </span> form<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"photo"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"png@"</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> Base64<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>encodeBase64String(uploadFile<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getContent())); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ③调用上传文件服务</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> response <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> restTemplate<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>postForObject(SERVER_URL, form, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>class); System<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>out<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"response:\n"</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> response); assertTrue(response<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>indexOf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"png"</span>) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>); } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>
在①处选择一个要上传的文件,在②处将其转换为一个格式化字符串并使用 photo 传
递,③处直接调用 user.upload.photo#1.0 服务上传文件。
文件上传控制
一般情况下,服务开放平台对上传文件的类型及大小都有严格的限制,一方面保障了
服务平台的安全,另一方面也可以限制了服务平台资源的占用。
默认情况下,Rop 不限制上传文件的类型且允许最大上传文件的大小为 10M。可以通
过rop:annotation-driven/>进行相应的限制:
<
rop:annotation-driven
337
Rop 开发手册 V1.0
upload-file-max-size=”10”
upload-file-types=”png,gif”/>
upload-file-max-size 的单位为 K,用以指定最大上传文件的大小,而 upload-file-types
用于指定允许上传的文件类型, 多值用逗号分隔。 如果允许上传所有文件, 可以设置为 “*” 。
按照以上的配置,允许上传的文件类型为 png 及 gif,而最大允许上传文件的大小为 10K。
按照rop手册的给的示列可以完成简单的单个文件上传,但是如果业务场景中会用涉及到多文件上传(一次传递多张图片)就是一件很头疼的事了
解决思路:
1.可以将多张文件流以“-”等符号拼接成字符串,到后台我们再进行拆分,再将字符串转成流进行文件上传,但是这样还有一个问题string最大容量是2.3M所以如果文件过大时这种方法就不行了