rop 文件上传

一 说明
本章节讲解使用rop进行文件上传(图片) 暂时先引用文档的说明,因为文档已经说的很明白了
由于服务请求报文是一个文本,无法直接传送二进制的文件内容,因此必须采用某种
转换机制将二进制的文件内容转换为字符串。Rop 采用如下的方式对上传文件进行编码:
fileType@BASE64( 文件内容 )
fileType代表文件类型,文件内容采用 BASE64 算法进行编码,这样二进制的文件
内容就可以转换为一个字符串,两者“@”字符分隔。服务端接收到上传的文件后,即可
解析出文件的类型和文件的内容。
Rop 定义了一个 UploadFile,代表一个上传的文件,来看一下 UploadFile 的定义:
UploadFile.java

package com.rop.request;
import com.rop.annotation.IgnoreSign;
import org.springframework.util.FileCopyUtils;
import java.io.File;
import java.io.IOException;
//①说明签名算法将忽略所有 UploadFile的参数数据的签名
@IgnoreSign
public class UploadFile {
private String fileType;
private byte[] content;
public UploadFile(String fileType, byte[] content) {
this.content = content;
this.fileType = fileType;
}
public UploadFile(File file) {
try {
//说明签名算法将忽略所有 UploadFile
//的参数数据的签名。
//335
//Rop 开发手册 V1.0
this.content = FileCopyUtils.copyToByteArray(file);
this.fileType = file.getName().substring(file.getName().lastIndexOf('.')+1);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String getFileType() {
return fileType;
}
public byte[] getContent() {
return content;
}
}

UploadFile 类定义处标注了@IgnoreSign 注解,这说明 Rop 的签名算法会忽略所有
UploadFile 属性。因此,客户端无须将上传文件的参数纳入到签名参数列表中。
Rop 定义了一个服务于 UploadFile 中的转换器: UploadFileConverter, Rop 已经在内部
注册了这个转换器,因此可以在 RopRequest 实现类中直接使用 UploadFile,Rop 会自动将
代表上传文件的格式化字符串参数正确绑定到 UploadFile 中。

文件上传实例
rop-sample 的 UserService 有一个用于上传用户头像的服务方法:
代码清单 27 UploadFile.java

@ServiceMethod(method = "user.upload.photo", version = "1.0", httpAction = HttpAction.POST)
public Object uploadPhoto(UploadUserPhotoRequest request) throws Throwable {
//①获取上传文件的类型和文件内容
String fileType = request.getPhoto().getFileType(); 
int length = request.getPhoto().getContent().length;
ClassPathResource outFile = new ClassPathResource("/");
//②将上传的文件保存到类路径下
FileCopyUtils.copy(request.getPhoto().getContent(), 
new File(outFile.getFile().getParent()+"/1." + fileType));
UploadUserPhotoResponse response = new UploadUserPhotoResponse();
response.setFileType(fileType);
response.setLength(length);
return response;
}

在①处获取文件的类型和文件的内容,在②处将其保存到服务器的类路径下,最后返
回上传成功的响应。 uploadPhoto()服务方法的入参是 UploadUserPhotoRequest, 其代码如下
所示:

public class UploadUserPhotoRequest extends AbstractRopRequest {
private String userId;
//①
private UploadFile photo; 
…
}

photo 属性对应的类型即是 UploadFile,Rop 会自动将格式化的 photo 字符串请求参数
绑定到这个属性对象中。 下面是客户端调用 user.upload.photo#1.0 服务的测试方法, 它位于
UserServiceRawClient 类中:
代码清单 28 UserServiceRawClient.java:测试调用上传文件服务

@Test
public void testUploadUserPhoto() throws Throwable {
RestTemplate restTemplate = new RestTemplate();
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
form.add("method", "user.upload.photo");
form.add("appKey", "00001");
form.add("v", "1.0");
form.add("sessionId", "mockSessionId1");
form.add("locale", "en");
form.add("userId", "1");
String sign = RopUtils.sign(form.toSingleValueMap(), "abcdeabcdeabcdeabcdeabcde");
form.add("sign", sign);
//如果没有指定相对的类名,该类将从类的根路径开始寻找某个resource,如果指定了相对的类名,则根据指定类
//的相对路径来查找某个resource。 
ClassPathResource resource = new ClassPathResource("photo.png");
//方法二 直接new一个File  列如:File file = new File("E://333.jpg");  
//UploadFile uploadFile = new UploadFile(file);这样也可以   
UploadFile uploadFile = new UploadFile(resource.getFile());// ①构造一个上传文件对象
// ②添加一个上传的文件, photo 参数不参与签名   
form.add("photo", "png@" + Base64.encodeBase64String(uploadFile.getContent()));
// ③调用上传文件服务
String response = restTemplate.postForObject(SERVER_URL, form, String.class);
System.out.println("response:\n" + response);
assertTrue(response.indexOf("png") > -1);
}

在①处选择一个要上传的文件,在②处将其转换为一个格式化字符串并使用 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所以如果文件过大时这种方法就不行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值