java - primeng fileUpload 发送表单数据并将文件数组传递给服务层
问题描述
我正在使用 p-fileUpload primeng 组件。我有一个要求,除了选择的文件之外,还必须提交表单中的另一个 p-multiselect。以下是文件上传的工作代码。当我选择并单击上传时,它会上传文件。我想将 uploadFileCtr($event) 更改为 uploadFileCtr($event,faqForm.value ) 并在 ts 文件的 uploadFileCtr() 方法中传递注释代码。我尝试将此行添加到 service.ts formdata:
formData.append("faqObj", faqObj);
但是我无法在我的休息服务中获得对象。我试图在我的 POST 方法中包含另一个参数:@FormDataParam("faqObj") Faq
。这给了我错误。
我的 coponent.html 看起来像这样
<form [formGroup]="faqForm" >
<div class="row">
<div class="col-sm-4">
<p-fileUpload name="myfile[]" multiple="multiple" accept=".xlsx" customUpload="true"
(uploadHandler)="uploadFileCtr($event)">
</p-fileUpload>
</div>
<div class="col-sm-4">
<label >Board ID(s) *:</label>
<p-multiSelect [options]="boards" formControlName="board" [defaultLabel]="'All Active Boards'" (onChange)="displayBoard($event)"></p-multiSelect>
</div>
<div class="col-sm-4" *ngIf = "show">
<label >Board Title:</label>
<input class="pInputFilter pInputTxt" type="text" readonly id="boardname" value={{this.userSelectedBoard}}>
</div>
</div>
</form>
uploadFileCtr 的 component.cs 如下
uploadFileCtr(event) {
// faqObj.faqBoards = faqObj.board.map(boardId=>{
// let boardObj:Board = new Board();
// boardObj.id = boardId;
// return boardObj;
// });
for(let file of event.files) {
this.uploadedFiles.push(file);
}
this.faqService.uploadFile(this.uploadedFiles).subscribe( posts =>{
this.data = posts;
},
error => console.log("Error: ", error),
() => {
this.errMsg = this.data.error;
// this.succMsg = this.data.success;
if (this.errMsg) {
console.log("errMsg: ", this.errMsg);
this.msgs = [];
this.msgs.push({severity:'error', summary:'Error Message', detail:this.data.error});
this.status = "error";
} else {
// this.getCaseDocuments();
this.msgs = [];
this.msgs.push({severity:'success', summary:'Success Message', detail:this.data.success});
}
});
this.faqForm.reset();
}
上传 REST 服务的 Service.ts 是
uploadFile( uploadedFiles: any[]){
let file: File = null;
let formData:FormData = new FormData();
if(uploadedFiles != null && uploadedFiles.length > 0){
file = uploadedFiles[0];
}
if(file != null){
formData.append("file", file);
formData.append("fileName", file.name);
}else{
formData.append("file", null);
formData.append("fileName", "");
}
return this.http.post(this.faqServiceURL +"/upload", formData, { 'headers': this.headers });
}
}
@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public Response upload(@FormDataParam("file") InputStream is,
@FormDataParam("fileName") String fileName){
logger.info("FaqService - upload");
System.out.println("upload : "+fileName+" faqObj : ");
ObjectMapper mapper = utilityObj.getMapperObj();
String jsonInString = ""; ..//////
}
- 我可以在上传的同时添加 formobj - 如果可以,怎么做?
- 如何发送多个文件?formData.append("文件", 文件); - 这不接受数组
解决方案
问题 1 - 我可以在上传的同时添加 formObj - 如果可以,如何添加?
如果您必须在 formData 中发送整个对象,有两种方法,
- 像这样对对象进行字符串化 -
formData.append("faqObj", JSON.stringify(faqObj));
在这种情况下,服务器必须解析字符串化的对象。 - 另一种方法是附加对象的键循环遍历对象,如Object.keys(faqObj).forEach(ele => formData.append(`faqObj[${ele}]`), faqObj[ele]) 在这种情况下,服务器不必解析对象。
问题 2-如何发送多个文件?formData.append("文件", 文件); - 这不接受数组
为此,您必须按如下方式遍历文件数组
uploadedFiles.forEach(file => formData.append('file[]', file))
推荐阅读
- python - 我是 python 的新手,正在为我的物理项目进行编码,该项目需要生成一个带有变量 E 的矩阵
- acumatica - 登录后活动
- python - 如何实现终点线?
- mongodb - 如何更改 MongoDB 中对象中的数据?
- ruby-on-rails - 'books=(books)' 方法在做什么?
- debugging - unrecognizedPacketType,Actor server1.conn1.tabDescriptor1 无法识别数据包类型“附加”
- elasticsearch - 每天存储桶的文档数并应用了一些过滤器
- graphql - Graphql,仅当记录不为空时才返回结果
- android - AndroidError:程序类型已经存在:android_serialport_api.SerialPort 当我尝试从 Android Studio 生成签名 APK
- angular - 值不会在角度 6 处绑定到选择器