我目前正在构建一个基于ODK聚合服务器和收集应用程序构建的webapp。前端从用户收集数据并将其转换为符合上传到的服务器的XML文件。
我已经分阶段开发了它,因为我从它的/ formUpload位置自动上传到服务器,这是一个外部位置。当使用接收文件输入的表单时,我在表单操作中有/ formUpload位置的完整URL。当我这样做时,所有这些都被完美地提交了。
但是,由于表单数据将动态生成到xml而不是从文件输入中生成,我需要找到另一种方法将此xml文件提交到服务器。我一直在尝试使用cURL让它一直工作,但没有成功。返回的错误消息如下:
错误:未收到表单名称或表单XML说明。
我的结论是,由于提交内容的不同,这种情况正在发生。虽然我肯定会提交与multipart / form-data相同的文件,但我觉得我的PHP提交格式必须与HTML表单的格式略有不同。
有人知道在使用cURL请求时HTML表单应该是什么样的吗?以下是两组数据:
形式:
<form id="ie_backward_compatible_form" action='upload.php'
enctype="multipart/form-data" encoding="multipart/form-data"
method="POST" accept-charset="UTF-8">
<table id="uploadTable">
<tbody>
<tr>
<td>
<label for="form_def_file">Form definition (xml file):</label>
</td>
<td>
<input id="form_def_file" class="gwt-Button" type="file"
name="form_def_file" size="80">
</td>
</tr>
<tr>
<td>
<label for="mediaFiles">Optional Media file(s):</label>
</td>
<td>
<input id="mediaFiles" class="gwt-Button" type="file"
multiple="" name="datafile" size="80,20">
<input id="clear_media_files" class="gwt-Button"
type="button"
onclick="clearMediaInputField('mediaFiles')"
value="Clear">
</td>
</tr>
<tr>
<td>
<input class="gwt-Button" type="button"
value="Upload Form" name="button" onclick="submitXML()">
</td>
</tr>
</tbody>
</table>
</form>
PHP:
<?php
if (!empty ($_POST['xmlDoc']))
{
$milliseconds = round(microtime(true) * 1000);
$doc = $_POST["xmlDoc"];
$dest = "uploads/tmp/tmp_".$milliseconds.".xml";
file_put_contents($dest , $doc );
// initialise the curl request
$request = curl_init('https://odk-aggregate-test-158709.appspot.com/formUpload');
curl_setopt($request, CURLOPT_POST, true);
curl_setopt(
$request,
CURLOPT_POSTFIELDS,
array(
'form_def_file' =>
'@'.$dest ,
'datafile' => ''
));
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
echo curl_exec($request);
if(curl_error($request))
{
echo 'error:' . curl_error($request);
}
// close the session
curl_close($request);
}
?>
另请注意,如果任何PHP看起来很糟糕,那是因为它可能是。我之前从未使用过它,所有在那里完成的工作都来自于我可以用这种形式做我需要做的事情。
非常感谢所有帮助,
感谢。