Javascript 如何向FOSRestBundle控制器提交包含文件的表单
我在客户端使用AngularJS向服务器端的控制器提交表单 因为我们将文件存储在应用程序中,并且用户提供了有关文件的一些元数据,所以工作流不能拆分为较小的任务 我使用Angular的$http服务上的请求转换构建了提交数据。web服务客户端的当前状态:Javascript 如何向FOSRestBundle控制器提交包含文件的表单,javascript,symfony,fosrestbundle,Javascript,Symfony,Fosrestbundle,我在客户端使用AngularJS向服务器端的控制器提交表单 因为我们将文件存储在应用程序中,并且用户提供了有关文件的一些元数据,所以工作流不能拆分为较小的任务 我使用Angular的$http服务上的请求转换构建了提交数据。web服务客户端的当前状态: function _save(dataModel, formfile) { $http({ url : basePath + (dataModel.id ? ("/" + dataModel.id) : ""),
function _save(dataModel, formfile)
{
$http({
url : basePath + (dataModel.id ? ("/" + dataModel.id) : ""),
method : "POST",
headers : {
'Content-Type' : undefined
},
transformRequest : function(data)
{
var formData = new FormData();
formData.append("dto", angular.toJson(data.model));
formData.append("file", data.file);
return formData;
},
data : {
model : dataModel,
file : formfile
}
}).then(function(response)
{
});
}
不幸的是,我得到了这样的回应:
415不支持的媒体类型
我无法确定Symfony堆栈的哪个组件提供了该回复,也无法确定它是指multipart/form data
还是指附加到文件的内容类型:应用程序/octet流
规范
我能做些什么来调试和修复这个问题吗?我怀疑这是一个配置问题。以下是我在config.yml中添加到默认Symfony配置的元素:
# Nelmio CORS Configuration
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: ['*']
allow_headers: ['*']
allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
max_age: 3600
hosts: []
origin_regex: false
# FOSRest Configuration
fos_rest:
body_listener: true
body_converter:
enabled: true
validate: true
validation_errors_argument: validationErrors # This is the default value
format_listener:
rules:
- { path: '^/', priorities: ['json'], fallback_format: json, prefer_extension: false }
param_fetcher_listener: true
view:
view_response_listener: 'force'
formats:
json: true
html: false
#
# Needed for being able to use ParamConverter
sensio_framework_extra:
request: { converters: true }
我已经解决了使用JavaScript将文件转换为base64字符串并将文件作为文本字符串发送的问题。我实现的解决方案归结为手动处理通常由ParamConverter注释(在本项目中)处理的任务(反序列化和验证):
/**
* @Rest\Post("")
*/
public function postAction(Request $request)
{
//
// Deserialisation
$dto = $this->deserializeDto($request);
if ($dto == null) {
return $this->view("Invalid 'dto' parameter contents.", response::HTTP_BAD_REQUEST);
}
//
// Validation: the name ('Nom') and a file are required
$validationErrors = [ ];
if ($dto->getNom() === null || strlen($dto->getNom()) == 0) {
$validationErrors[] = "'Nom' is missing";
}
$file = $request->files->get("file");
if ($file === null) {
$validationErrors[] = "No file provided";
}
if (count($validationErrors) > 0) {
$view = $this->view($validationErrors, response::HTTP_BAD_REQUEST);
return $view;
}
//
// processing
return $this->doSave($dto, $request);
}
/**
* @Rest\Post("")
* @ParamConverter("dto", converter="fos_rest.request_body", options={"validator"={"groups"={"edit"}}})
* @Rest\QueryParam(name="dto", nullable=false)
*/
public function postAction(Request $request, Document $dto, ConstraintViolationListInterface $validationErrors)
{
....
}