Angular - 无法上传多部分文件
Angular - Unable to Upload MultiPart file
我正在开发一个 Angular 8 应用程序,该应用程序使用 @aws-amplify/api 库来向 Spring 启动后端应用程序发出 http rest 请求。
我正在尝试执行从 Angular 到 Spring 引导的多部分文件上传,但 运行 出现问题。我正在尝试使用 ngx-material-file-input 库来执行上传
这是相关的代码部分
组件中的表单元素HTML文件
<mat-form-field>
<ngx-mat-file-input formControlName="pressReleaseFile" placeholder="Required input" valuePlaceholder="No file selected" required></ngx-mat-file-input>
<mat-icon matSuffix>folder</mat-icon>
<mat-error *ngIf="pressReleaseForm.get('pressReleaseFile').hasError('required')">
Please select a file
</mat-error>
<mat-error *ngIf="pressReleaseForm.get('pressReleaseFile').hasError('maxContentSize')">
The total size must not exceed {{pressReleaseForm.get('pressReleaseFile')?.getError('maxContentSize').maxSize | byteFormat}}
({{pressReleaseForm.get('pressReleaseFile')?.getError('maxContentSize').actualSize
| byteFormat}}).
</mat-error>
</mat-form-field>
**组件打字稿文件中的上传方法**
public savePressRelease(): void {
//See
if (!this.isFormSubmissionValid()) {
return;
}
const pressReleaseFile = this.pressReleaseForm.get('pressReleaseFile').value;
const formData: FormData = new FormData();
formData.append('pressReleaseFile', pressReleaseFile);
console.log("formData");
console.log(formData);
this.error = null;
this.inProgress = true;
this.pressReleaseService.savePressReleaseRecord(formData)
.then((savedPressRelease: PressRelease) => {
this.inProgress = false;
this.dialogRef.close(true);
this.snackBar.open('Press Release Record Added.', null, { duration: 3000 });
})
.catch( error => {
this.inProgress = false;
this.error = 'There was an error saving the Press Release Record';
});
}
** 服务方法 savePressReleaseRecord **
savePressReleaseRecord(formData: FormData): Promise<PressRelease> {
console.log("formData pressReleaseData");
console.log(formData);
return API.post('serverAPI', '/pressRelease', { body: formData })
.then(r => r as PressRelease);
}
我注意到的一件事是打印 formData 的输出是一个空对象。
有什么突出的我做错了吗
当我在 chrome 开发人员工具中检查请求负载时 - Spring 引导端点的请求负载为空
非常感谢任何帮助
谢谢
达米恩
daterangepicker-material": "^2.1.7",` 它工作正常。我建议您尝试通过订阅 formControl 的可观察值更改来查看 fileInput 的值。
this.fileForm.get('basicfile').valueChanges.subscribe(data => {
console.log(data);
});
之后,如果您尝试获取 formControl 的值并在控制台中查看它,您将得到这样的东西。它不是空的 ;)
您必须在 TypeScript 文件
中看到您的 API 请求 header
API.post('serverAPI', '/pressRelease', { body: formData })
你应该创建一个特殊的 post 函数来将你的表单数据发送到后端而不需要这个 header
'Accept': 'application/json'
必要时添加这个
"Content-Type": "application/octet-stream",
否则您的后端会将您的 post 请求的内容视为 Json
切换到使用 httpClient 而不是 @aws-amplify/api,文件上传现在按预期工作
我正在开发一个 Angular 8 应用程序,该应用程序使用 @aws-amplify/api 库来向 Spring 启动后端应用程序发出 http rest 请求。 我正在尝试执行从 Angular 到 Spring 引导的多部分文件上传,但 运行 出现问题。我正在尝试使用 ngx-material-file-input 库来执行上传 这是相关的代码部分 组件中的表单元素HTML文件
<mat-form-field>
<ngx-mat-file-input formControlName="pressReleaseFile" placeholder="Required input" valuePlaceholder="No file selected" required></ngx-mat-file-input>
<mat-icon matSuffix>folder</mat-icon>
<mat-error *ngIf="pressReleaseForm.get('pressReleaseFile').hasError('required')">
Please select a file
</mat-error>
<mat-error *ngIf="pressReleaseForm.get('pressReleaseFile').hasError('maxContentSize')">
The total size must not exceed {{pressReleaseForm.get('pressReleaseFile')?.getError('maxContentSize').maxSize | byteFormat}}
({{pressReleaseForm.get('pressReleaseFile')?.getError('maxContentSize').actualSize
| byteFormat}}).
</mat-error>
</mat-form-field>
**组件打字稿文件中的上传方法**
public savePressRelease(): void {
//See
if (!this.isFormSubmissionValid()) {
return;
}
const pressReleaseFile = this.pressReleaseForm.get('pressReleaseFile').value;
const formData: FormData = new FormData();
formData.append('pressReleaseFile', pressReleaseFile);
console.log("formData");
console.log(formData);
this.error = null;
this.inProgress = true;
this.pressReleaseService.savePressReleaseRecord(formData)
.then((savedPressRelease: PressRelease) => {
this.inProgress = false;
this.dialogRef.close(true);
this.snackBar.open('Press Release Record Added.', null, { duration: 3000 });
})
.catch( error => {
this.inProgress = false;
this.error = 'There was an error saving the Press Release Record';
});
}
** 服务方法 savePressReleaseRecord **
savePressReleaseRecord(formData: FormData): Promise<PressRelease> {
console.log("formData pressReleaseData");
console.log(formData);
return API.post('serverAPI', '/pressRelease', { body: formData })
.then(r => r as PressRelease);
}
我注意到的一件事是打印 formData 的输出是一个空对象。 有什么突出的我做错了吗 当我在 chrome 开发人员工具中检查请求负载时 - Spring 引导端点的请求负载为空
非常感谢任何帮助
谢谢 达米恩
daterangepicker-material": "^2.1.7",` 它工作正常。我建议您尝试通过订阅 formControl 的可观察值更改来查看 fileInput 的值。
this.fileForm.get('basicfile').valueChanges.subscribe(data => {
console.log(data);
});
之后,如果您尝试获取 formControl 的值并在控制台中查看它,您将得到这样的东西。它不是空的 ;)
您必须在 TypeScript 文件
中看到您的 API 请求 headerAPI.post('serverAPI', '/pressRelease', { body: formData })
你应该创建一个特殊的 post 函数来将你的表单数据发送到后端而不需要这个 header
'Accept': 'application/json'
必要时添加这个
"Content-Type": "application/octet-stream",
否则您的后端会将您的 post 请求的内容视为 Json
切换到使用 httpClient 而不是 @aws-amplify/api,文件上传现在按预期工作