2016-07-07 2 views
0

Я хочу, чтобы загрузить файл размером больше, чем 32 МБ до ГКС непосредственно из AngularJSAngularJS Direct Загрузить в Ошибка Google Cloud Storage

Я мог успешно загрузить на Blobstore, когда размер файла меньше 32 МБ, используя код, указанный ниже.

$http.post(uploadUrl, $scope.formData, { 
    withCredentials: true, 
    headers: {'Content-Type': undefined}, 
    transformRequest: angular.identity 
}); 

При попытке загрузить файл с помощью URL https://storage.googleapis.com/bucket-name/filename, я получил следующее сообщение об ошибке.

Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'http://localhost:8080' is therefore not allowed access.

Когда я удалить флаг withCredentials: true, используемый в HTTP POST, я получил ответ, как 403, никаких подробностей об ошибках не приводится.

Я устанавливал CORS, как указано в ведре загрузки [{"maxAgeSeconds": 3600, "method": ["GET", "POST", "HEAD"], "origin": ["http://localhost:8088"], "responseHeader": ["Content-Type"]}]

Как включить Access-Control-Allow-Credentials флаг на сервере?

ответ

1

Вы можете выполнить это, продолжая использовать blobstore, вместо перехода на Cloud Storage. Документы Google, которые обрабатываются достаточно хорошо. Предупреждение: мне кажется, что Google поддерживает это как устаревшую функцию, но вместо этого рекомендует использовать Could Storage. Я не делал этого лично, но похоже, что Signed URLs может быть ответом.

Если вы хотите продолжить использование blobstore, как у меня есть, инструкции для настройки на стороне сервера в Java - here. Вы должны найти аналогичные инструкции для других языков с одинаковыми URL-адресами. :)

Сложная часть, которую я не понимал вначале: запрос прямой загрузки делает свою работу, затем делает вызов непосредственно на ваш сервер с информацией о загрузке, а затем использует ответ вашего сервера в ответ на ответ клиент. Например, вы можете установить заголовок Access-Control-Allow-Origin в обработчике загрузки вашего сервера, и он будет добавлен к ответу из прямой ссылки на скачивание.

+0

Hi @Eric, спасибо за ответ. Я попробовал подписанный URL-адрес, так как я предположил, что получил ту же ошибку. Загрузка выполнена успешно, но не загружается. Для загрузки через blobstore у меня возникла другая ошибка, обратитесь к http://stackoverflow.com/questions/38344261/gcs-heap-error-when-file-of-higher-size-was-uploaded. Я не смог успешно использовать заголовок 'Access-Control-Allow-Origin', изменив заголовок по умолчанию httpProvider' $ httpProvider.defaults.headers.common ['Access-Control-Allow-Origin'] = '*'; 'с' withCredentials : false' настройка не очень помогла. Не могли бы вы посоветовать мне использовать заголовок? – SetV

+0

Вам необходимо установить этот заголовок на _response_, отправленный с вашего _server_, без запроса от вашего клиента. Поэтому в вашем Java-коде (который я вижу, это ваш язык выбора из другого связанного вами вопроса), вы можете использовать 'resp.setHeader (« Access-Control-Allow-Origin »,« * »);'. –

+0

Hi @Eric, я могу придерживаться ваших первых двух решений. Это действительно помогает! – SetV