В php я хочу загрузить s3 файл на браузер, не храня его на моем сервере

Как сказал Анмол Гаутам , вам нужно переопределить функцию QWebEnginePage :: acceptNavigationRequest и получить необходимые данные с помощью JavaScript.

Вот пример, как это сделать:

mywebpage.h

#include 

class MyWebPage : public QWebEnginePage
{
    Q_OBJECT
public:
    explicit MyWebPage(QWebEngineProfile *profile = Q_NULLPTR, QObject *parent = Q_NULLPTR);

protected:
    bool acceptNavigationRequest(const QUrl & url, QWebEnginePage::NavigationType type, bool isMainFrame);
}

mywebpage.cpp

[111 ]

используйте QWebEngineView :: setPage , чтобы установить для своего подкласса WebPage значение WebView, прежде чем вызывать функцию загрузки WebViews.

Вот ссылка для получения дополнительной информации о HTML DOM form Collection

5
задан Corey 21 April 2009 в 13:08
поделиться

3 ответа

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

Если это не вариант, вы Можно попробовать следующие классы PHP:

  • Клиент протокола HTTP - Класс, который реализует запросы к ресурсам HTTP (используется в обертке потока ниже). Разрешает потоковую передачу запросов.
  • gHttp - Оболочка потока HTTP, которая позволяет обрабатывать удаленные ресурсы HTTP как файлы, используя функции, такие как fopen () , fread () , и т.д.
  • Amazon S3 Stream Wrapper - потоковая оболочка Amazon S3 того же разработчика, что и gHttp. Также позволяет получать доступ к удаленным ресурсам, как к обычным файлам, через fopen ('s3: // ...') .

Редактировать:

На этой странице есть информация о том, как " предварительно аутентифицировать "запрос путем кодирования ключа аутентификации в URL. Он находится в разделе под названием: Альтернатива аутентификации запроса строки запроса .

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Затем просто перенаправьте пользователя на $ url , и он сможет загрузить файл. Подпись кодируется с помощью односторонней схемы шифрования (sha1), поэтому нет риска раскрытия вашего секретного ключа доступа AWS.

Также позволяет получать доступ к удаленным ресурсам, как к обычным файлам, через fopen ('s3: // ...') .

Редактировать:

На этой странице есть информация о том, как " предварительно аутентифицировать "запрос путем кодирования ключа аутентификации в URL. Он находится в разделе под названием: Альтернатива аутентификации запроса строки запроса .

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Затем просто перенаправьте пользователя на $ url , и он сможет загрузить файл. Подпись кодируется с помощью односторонней схемы шифрования (sha1), поэтому нет риска раскрытия вашего секретного ключа доступа AWS.

Также позволяет получать доступ к удаленным ресурсам, как к обычным файлам, через fopen ('s3: // ...') .

Редактировать:

На этой странице есть информация о том, как " предварительно аутентифицировать "запрос путем кодирования ключа аутентификации в URL. Он находится в разделе под названием: Альтернатива аутентификации запроса строки запроса .

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Затем просто перенаправьте пользователя на $ url , и он сможет загрузить файл. Подпись кодируется с помощью односторонней схемы шифрования (sha1), поэтому нет риска раскрытия вашего секретного ключа доступа AWS.

Альтернатива Query String Request Authentication .

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Затем просто перенаправьте пользователя на $ url , и он сможет загрузить файл. Подпись кодируется с помощью односторонней схемы шифрования (sha1), поэтому нет риска раскрытия вашего секретного ключа доступа AWS.

Альтернатива Query String Request Authentication .

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Затем просто перенаправьте пользователя на $ url , и он сможет загрузить файл. Подпись кодируется с помощью односторонней схемы шифрования (sha1), поэтому нет риска раскрытия вашего секретного ключа доступа AWS.

5
ответ дан 14 December 2019 в 13:46
поделиться

Вы пробовали использовать только readfile (" http: // username: password @ host /filename.ext")?

Это просто пропустит и запишет непосредственно в выходной буфер, однако, если тип содержимого имеет значение, вам необходимо сначала проверить это.

Использование en URL в качестве аргумента для файла чтения также требует, чтобы PHP был скомпилирован с поддержкой urlwrapper.

0
ответ дан 14 December 2019 в 13:46
поделиться

Вы пытались использовать http_get с request_options для указания типа httpauth и httpauth? Хотя я не помню, предполагает ли этот метод строковый допустимый тип, который может не работать для двоичного кода.

Если это удастся, вы сможете указать правильный тип MIME и записать его в браузер.

1
ответ дан 14 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: