【问题标题】:SilverStripe 4 - No file uploaded/database written via AJAXSilverStripe 4 - 没有文件上传/通过 AJAX 写入数据库
【发布时间】:2018-05-21 09:45:35
【问题描述】:

正如here 报告的那样,我遇到了一个与通过 ajax 请求上传到 CMS 的文件相关的问题。 基本上,我得到了一个前端表单,它必须通过 ajax 调用将文件发送到页面控制器。这些文件必须保存并与实现File::class/$many_many 属性/关系的Member/DataExtension 相关(以便将它们保存并关联到每个CMS 用户)。

这是我的方法:

我的Member Extension

[...]
/**
 * Classe Utente - Estensione
 */
class UtenteExtension extends DataExtension
{
    // Dichiarazione Proprietà
    private static $many_many = [
        'AllegatiUpload' => File::class, // this field should save users file uploads
        [...]
    ];
    private static $owns = [
        'AllegatiUpload',
        [...]
    ];
[...]

涉及的Controller

use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\ErrorPage;
use SilverStripe\Assets\Folder;
use SilverStripe\Assets\File;
use SilverStripe\Assets\Upload;
use SilverStripe\Security;
use SilverStripe\Security\Group;
use SilverStripe\Assets\Storage\AssetStore;

/**
 * Classe Controller Utente - Dashboard
 */
class UtenteDashboardController extends PageController
{
    // Dichiarazione Proprietà
    private static $allowed_actions = [
        'carica'
    ];

    /**
    * Funzione gestione validazione ed invio form caricamento
    * @param  HTTPRequest $request Richiesta HTTP
    * @return HTTPResponse Risposta HTTP
    */
    public function carica(SS_HTTPRequest $request) {
        if (!$request->isAjax()) {
            return ErrorPage::response_for(404);
        } else if (!$request->isPOST()) {
            return $this->httpError(400, 'Metodo POST richiesto');
        } else {
            $documento = $request->postVar('documento'); // File data sent by FormData JS API

            if (!isset($documento)) {
                return $this->httpError(500, 'Dati richiesti mancanti');
            } else {
                // User check
                $utente = Security::getCurrentUser();

                if ($utente->inGroup(Group::get()->filter('Code', 'clienti')->first()->ID)) {
                    // File uploading
                    $cartellaUpload = 'clienti/'. strtolower($utente->Surname) .'/uploads';

                    Folder::find_or_make($cartellaUpload);

                    // I tried with the official guide approach, with this line - with no results
                    //$utente->AllegatiUpload()->setFromLocalFile($cartellaUpload, documento, AssetStore::CONFLICT_OVERWRITE);
                     // Then I tried with this approach
                    $file = File::create();
                    $upload = Upload::create();

                    $upload->loadIntoFile($documento, $file, $cartellaUpload);

                    // Upload check
                    if ($upload->isError()) {
                        return $this->httpError(400, 'Errore di caricamento file');
                    } else {
                        // Relate the file to the destinaion user field
                        $utente->{'AllegatiUpload.ID'} = $upload->getFile()->ID;
                        // Update user
                        $utente->write(); 

                        return new HTTPResponse;
                    }
                } else {
                    return $this->httpError(401, 'Utente non abilitato');
                }
            }
        }
    }
}

这导致没有写入数据库文件表,也没有文件上传到设计的assets 目标文件夹中。此外,不会抛出任何异常 - 它返回 HTTPResponse 所以我认为代码运行时没有错误?无论如何,这是请求结果:

此时我不明白我在这里缺少什么。

谁能帮我找出错误?

提前致谢。

【问题讨论】:

  • 请将您的解决方案作为答案发布并接受 =)

标签: php silverstripe silverstripe-4


【解决方案1】:

似乎我的问题与错误注入的依赖项有关:

use SilverStripe\Security;

通过将其更改为指向正确的控制器:

use SilverStripe\Security\Security;

文件开始按预期上传。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多