我在我的应用中有这个表单,我想添加一个上传文件字段。我一直在阅读文档,当我测试它时,它不会上传文件。没有任何事情发生。
这是实体
/**
* @var string
*
* @ORM\Column(name="mynewpdf", type="string", length=350, nullable=true)
*/
private $mynewpdf;
/**
* Set mynewpdf
*
* @param string $mynewpdf
* @return userinfoid
*/
public function getmynewpdf()
{
return $this->mynewpdf;
}
/**
* Get mynewpdf
*
* @return string
*/
public function setmynewpdf($mynewpdf)
{
$this->mynewpdf = $mynewpdf;
return $this;
}
public function getPath()
{
$path = __DIR__.'/../../../../web/newfolder/';
$path .= '/'.$this->mynewpdf;
return $path;
} public function uploadmynewpdf($destinationDirectory)
{
if (null === $this->mynewpdf) return;
$nameFilePdf = uniqid().'.'.$this->mynewpdf->getClientOriginalExtension();
$this->_createdirectory($destinationDirectory);
$this->mynewpdf->move($destinationDirectory, $nameFilePdf);
$this->setmynewpdf($nameFilePdf);
}
private function _createdirectory($destinationDirectory)
{
$path = __DIR__.'/../../../../web/newfolder/';
if (!file_exists($path)) @mkdir($path, 0777, true);
$this->_createFileIndex($path);
if (!file_exists($destinationDirectory)) @mkdir($destinationDirectory, 0777, true);
$this->_createFileIndex($destinationDirectory);
}
private function _createFileIndex($myfolder)
{
$newfile = $myfolder.'index.html';
$content = "<html><head><title>403 Forbidden</title></head>".
"<body>This is Forbidden</body></html>";
if (!file_exists($newfile))
{
if (!$handle = @fopen($newfile, 'c')) die("Could not open/create new file");
if (@fwrite($handle, $content) === FALSE) die("Could not write the new file");
@fclose($handle);
}
return true;
}
我的控制器:
$file = $userinfoid->getMynewpdf();
if($file != null)
{
$fileName = md5(uniqid()).'.'.$file->guessExtension();
$file->move(
$this->container->getParameter('pdf_directory'),
$fileName
);
$userinfoid->setMynewpdf($fileName);}
最后是表格:
<form action="{{ path('add_document') }}" method="post" >
<input type="hidden" name="data[userinfoid]" value="{{ data.userinfoid }}" />
<div class="span12">
<label>Information about file</label>
<p>
<textarea id="fileinformation" rows="3" class="span11 campoInvalido" maxlength=""
title="Add some information"
name="data[fileinformation]" ></textarea>
</p>
</div>
<input type="file" id="mynewpdf" name="data[mynewpdf]" accept="application/pdf
</form>
我不认为表格是按照原本应该制作的。但是现在我无法改变它。有人能告诉我如何才能完成这项工作?
更新
首先,不要忘记分享有关代码问题的关键细节。
这是一个Ajax表单。我从来没有提过这个,应该有。
我的ajax请求是这样的:
$.ajax({
type:'POST',
url:'page/upload',
data: $("form").serialize(),
beforeSend:function(){$("#loadingModal").show();},
dataType:'json'})
上面的代码不处理文件上传,因为它序列化了数据。所以我用这个替换了代码:
var formData = new FormData($("form")[0]);
$.ajax({
type:'POST',
url:'page/upload',
data: formData,
cache: false,
contentType: false,
processData: false,
beforeSend:function(){$("#loadingModal").show();},
dataType:'json'})
然后在我的控制器中,我使用了这段代码:
$request = $this->getRequest();
$file = $request->files->get('mynewpdf');
// If a file was uploaded
if(!is_null($file)){
// generate a random name for the file but keep the extension
$filename = uniqid().".".$file->getClientOriginalExtension();
$userinfoid->setMynewpdf($filename);
$file->move(
$this->container->getParameter('pdf_directory'),
$filename
); // move the file to a path
}
现在我可以在我的网络应用程序中保存文件了!
感谢 Gabriel Diez 寻求帮助!
答案 0 :(得分:1)
我认为主要问题是你的表格。当您上传文件并将其发送到动作控制器时,没有传递任何内容,因为您的输入类型文件不像symfony想要的那样。 你应该看看symfony docs如何正确上传文件,它非常清晰和完整,我想你错过了一些重要的细节。
https://symfony.com/doc/2.8/controller/upload_file.html
而且为了生成表单你应该使用symfony中的表单助手,这是正确和安全地做到这一点的最好和最快的方法。
https://symfony.com/doc/2.8/forms.html
如果您仔细查看文档,可以在操作控制器中看到:
$product = new Product();
$form = $this->createForm(ProductType::class, $product);
在您的情况下,产品将是您的实体。
然后将$ form传递给视图。
在方法createForm中,您传递了表单的实体,因此symfony知道在表单中传递了什么类型的实体。因此,当它构建表单并且表单将被提交时,它会将输入文件与您的属性$ mynewpdf相关联,因此当您调用时:
$userinfoid->getMynewpdf();
您的文件将存在,然后您可以操纵它。
祝你好运