Повреждение при загрузке файла


Повреждение при загрузке файла

08.06.2020 10:34:13 Просмотров 52 Источник

Я пытаюсь загрузить файл в sharepoint

  1. Успешная попытка с just axios заключается в следующем enter image description here

  2. Неудача, если я загружаю с помощью Guzzle enter image description here enter image description here

Загруженный файл в конце поврежден

enter image description here

У вопроса есть решение - Посмотреть?

Ответы - Повреждение при загрузке файла / File upload corruption

Oluwafemi Sule

20.06.2020 06:46:40

При предоставлении контента для загрузки в клиент Guzzle в виде строки, Guzzle пытается вывести необходимую информацию о файле , такую как имя файла, тип содержимого .

Вы можете помочь Guzzle правильно вывести эти сведения для построения многосоставного запроса, передав информацию о имени файла и типе содержимого в многосоставной полезной нагрузке.

[
    //...

    'multipart' => [
        [
            'name' => 'fileName',
            'contents' => $request->file('file')->get(),
            'filename' => $request->file('file')->getName(),
            'headers' => [
               'content-type' => $request->file('file')->getMimeType(),
            ]
        ]
    ]
]
kundan

20.06.2020 09:31:46

Добавьте тип содержимого в виде большого двоичного объекта.

axios.post(
    'https://sharepoint....'
    ,data.get('file')
    {
        'headers' {
            'Authorization': `Bearer ${this.token}`
            ,'Content-Type': 'blob',
         }
    }
)
victoryoalli

21.06.2020 05:38:27

Попробуйте что-нибудь подобное. Удалите ->get() из вашего $request->file()

//Get the file object from the request.
$file = $request->file('file');

//Make the request
return (new Client)->request('POST', 'https://.sharepoint.com/sites....', [
    'headers'      => [ 'Authorization' => "Bearer {$this->token}" ],
    'multipart' => [
        [
            'name'     => 'FileContents',
            'contents' => $file,
            'filename' => $file->getClientOriginalName()
        ],
        
    ],
]);
Khalil Laleh

23.06.2020 11:54:57

Вы забыли добавить заголовки в Axios, рассмотрим Content-Type:

const data = new FormData();
data.append('file', fileAdded.file);

axios.post('/sharepoint/uploadFile', data, {
    headers: {
        'Authorization': `Bearer ${this.token}`,
        'Content-Type': 'multipart/form-data'
    }
});
Qumber

25.06.2020 12:37:52

Есть несколько вещей, которые вам нужно изменить, чтобы заставить это работать:

  1. Чтобы получить содержимое файла, вам нужно $request->file('file'), а затем использовать file_get_contents() на нем. Вы можете потерять часть get().

  2. Убедитесь, что вы отправляете заголовок для принятия multipart/form-data тоже:

    "Accept" => "multipart/form-data"
    
  3. Поля name и filename в форме - это две разные вещи. Первый - это имя поля, а второй-имя файла. Вам нужно послать и то, и другое.

Попробовать это:

protected function uploadFile(Request $request){
$file = $request->file('file');
$body = [
          "headers" => [
          "Accept" => "multipart/form-data",
          "Authorization" => "Bearer {$this->token}"
         ],
         "multipart" => [
          "name" => "file",
          "contents" => file_get_contents($file),
          "filename" => $file->getClientOriginalName()
        ]
     ];
return (new Client)->request('POST', 'https://.sharepoint.com/...', $body);
}

P. S. - Вы можете проверить, является ли файл действительным или не используя isValid():

if ($request->file('file')->isValid()) {
    //
}

Официальные документы по этому поводу: https://laravel.com/docs/7.x/requests#retrieving-uploaded-files

ThienHuynh

26.06.2020 08:44:35

На мой взгляд, вы должны сначала временно сохранить его где-то на своем локальном сервере, а затем отправить этот файл в sharepoint, удалить временный файл, я думаю, что если вы отправите его сразу же, не сохраняя его, файл будет поврежден. Пожалуйста, попробуйте ниже

$file = $request->file('logo');
$original_name = $file->getClientOriginalName(); // get original file
$name = time() . '_' . $original_name; // store it in different name so it would not be duplicated
$path = base_path() .'/public_html/your_project/public/temporary/'; // full path of file folder
// store the uploaded file
$file->move($path, $name);
$body = [
          "headers" => [
          "Authorization" => "Bearer {$this->token}"
         ],
         "multipart" => [
          "name" => "logo",
          "contents" => fopen($path . $name, 'r')
        ]
     ];
$response = (new Client)->request('POST', 'https://.sharepoint.com/...', $body);
// remove the file after done
unlink($path . $name);
return $response;

Надеюсь, это сработает для вас! Пожалуйста, поправьте меня, если я ошибся

Помочь в развитии проекта:
Закрыть X