Ошибка файла пути при загрузке файла CSV через форму laravel в базу данных - PullRequest
0 голосов
/ 31 мая 2019

Я хочу загрузить CSV-файл в свою базу данных через форму laravel. Я могу вставить файл, только если он хранится в общей папке. Как правильно установить путь с помощью функции fopen?

При отправке формы мой код использует только тот CSV, который уже существует в общей папке, а не тот CSV, который я пытаюсь загрузить. Кроме csv я также передаю некоторые другие данные своему контроллеру. Как я могу изменить код для получения файла формы, а не файла, хранящегося в общей папке?

1) Ниже приведен отрывок из моей формы. В нижней строке я пытаюсь загрузить файл.

<body>

    <form method='post' enctype="multipart/form-data" action="/hard">

        {{csrf_field()}}

        <section>
        <br>
            <legend><i><b> Complete Data Below</b></i></legend>
        <br>
        </section>

        <section>   
        Choose program:
            <select name="sc" id="xaos">

            <optgroup label="postgraduates">
                @foreach($transport as $y)
                    <option value="{{$y->object_id}}">{{$y->object_name}}</option>
                @endforeach
            </optgroup>

            </select>
        </section>

    <br>

        <section>
        ID number: 
            <input name='am' type='number' min="1000000" max="1999999" required="" oninvalid="this.setCustomValidity('1000000 < Value < 1999999')">
        </section>

        <br>

        <section>
        Select Language:
            <select name="language" id="lang">
                    <option value="GR"> Greek</option>
                    <option value="EN"> English</option>
            </select>
        </section>
        <br>
        <section>
        <label for="upload-file">select csv file</label>
            <input type="file" name="upload-file"> 
        </div>
            <input type='submit' name='upload' value="Submit!">
        </section>

    </form>
    <br>
    <br>

</body>

2) А ниже приведен фрагмент кода моего контроллера, который обрабатывает импортированный файл.

public function job(Request $p)
    {
        $a1 = $p -> get('sc');
        $a2 = $p -> get('am'); 
        $a3 = $p -> get('language'); 




    $f_rownum = 0;

    if (($handle = fopen ( 'MOCK_DATA.csv', 'r' )) !== FALSE) 

    {
        while ( ($data = fgetcsv ( $handle, 1000, ';' )) !== FALSE )
        {
            $ac1=$data[0];
            $ac2=iconv("Windows-1253", "UTF-8", $data[1]);
            $ac3=iconv("Windows-1253", "UTF-8", $data[2]);
            $ac4=iconv("Windows-1253", "UTF-8", $data[3]);
            $ac5=$data[4];
...............

1 Ответ

0 голосов
/ 31 мая 2019

Согласно документации Laravel, вы можете сохранить свой CSV-файл в хранилище следующим образом:

public function storeFile(Request $request)
    {
        $path = $request->file('upload-file')->store('{directoryName}');

        return $path;
    }

Приведенный выше код хранит ваш файл в хранилище и возвращает путь, по которому вы можете сохранить его в своей БД.

Для извлечения файла вы можете использовать этот код, если хотите заставить пользователя загрузить файл:

return Storage::download('{pathWhichYouSavedInDB}');

или вы можете получить содержимое файла, используя этот код:

$contents = Storage::get('{pathWhichYouSavedInDB}');

[Я добавляю дополнительный ответ, который я написал в комментариях] fopen требуется полный путь к хранимому файлу, чтобы можно было его открыть. Таким образом, вы можете получить URL файла и затем передать его функции fopen следующим образом:

$url = Storage::url('file.jpg');

Или вы вообще не можете использовать fopen и просто использовать содержимое $, которое вы уже получили с помощью

$contents = Storage::get('{pathWhichYouSavedInDB}');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...