Загрузите PDF-файл в GCS с помощью REST API — Coldfusion

Я пытаюсь загрузить PDF-файл в GCS REST API с помощью Coldfusion. Мой код выглядит следующим образом. Я получаю одну и ту же ошибку каждый раз. Когда я пытаюсь использовать файл PNG вместо PDF, он работает нормально.

<cffunction name = "uploadFileToCloudStorage" access = "remote" returnformat = "JSON" returntype = "any">
    <cfargument name = "bucket_name" default = "" />
    <cfargument name = "object_name" default = "" />
    <cfargument name = "object_location" default = ""/>
    <cfargument name = "object_content_type" default = "application/pdf" />
    <cfargument name = "access_token" required = "true" />
        
    <cffile action = "readBinary" file = "#arguments.object_location#" variable = "fileContent">
        
    <cfset endpoint = "https://storage.googleapis.com/upload/storage/v1/b/#arguments.bucket_name#/o?name=#arguments.object_name#&uploadType=media" />

    <cfhttp result = "result" method = "POST" charset = "utf-8" url = "#endpoint#" timeout = "60">
        <cfhttpparam type = "header" name = "Content-Type" value = "#arguments.object_content_type#" />
        <cfhttpparam type = "header" name = "Authorization" value = "Bearer #arguments.access_token#" />
        <cfhttpparam type = "body" value = "#fileContent#" />
    </cfhttp>
    <cfreturn replace(serializeJSON(result), '//', '') />
</cffunction>

Результат:

{
    "Mimetype": "Unable to determine MIME type of file.",
    "Errordetail": "I/O Exception: Received fatal alert: record_overflow",
    "Filecontent": "Connection Failure",
    "Statuscode": "Connection Failure.  Status code unavailable.",
    "Responseheader": {},
    "Text": true,
    "Charset": "",
    "Header": ""
}

в первый раз. Если я попробую еще раз, результат будет:

{
    "Mimetype": "Unable to determine MIME type of file.",
    "Errordetail": "I/O Exception: Connection reset",
    "Filecontent": "Connection Failure",
    "Statuscode": "Connection Failure.  Status code unavailable.",
    "Responseheader": {},
    "Text": true,
    "Charset": "",
    "Header": ""
}

Я попробовал base64, результат тот же. Я попробовал читать вместо readBinary с помощью cffile, и результат все тот же.

Можете ли вы опубликовать вызов функции для PDF и один для PNG? Кроме того, эти переменные должны иметь область действия var или local внутри функции. local.fileContent, local.endpoint и local.result.

Adrian J. Moreno 01.07.2024 19:22

Когда я публикую png-файл с изображением/png object_content_type, он работает нормально, приложение/pdf все еще выдает ту же ошибку.

Alpasp 02.07.2024 18:43

Попробуйте загрузить PDF-файл и запустить эту функцию для файла, чтобы посмотреть, что она вернет. helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functio‌​ns/…

Adrian J. Moreno 03.07.2024 01:34

Он возвращает приложение/pdf

Alpasp 03.07.2024 11:36

Есть ли у вас ссылка на документацию по API для этого REST API? Я нашел тот, для которого требуется PUT, и тот, для которого требуется POST. У обоих есть другие обязательные поля, которых я не вижу в вашем запросе. cloud.google.com/storage/docs/xml-api/post-object-multipart cloud.google.com/storage/docs/xml-api/put-object-upload

Adrian J. Moreno 03.07.2024 15:45

Я использую этот: cloud.google.com/storage/docs/… ОТДЫХ.

Alpasp 03.07.2024 16:49

Пробовали ли вы размещать те же файлы, используя пример CURL из вашей ссылки?

Adrian J. Moreno 05.07.2024 18:14

Речь идет о проблеме TLS. Я разместил ответ на этот вопрос ниже.

Alpasp 09.07.2024 17:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это проблема TLS. Когда я добавляю эти две строки кода, все работает:

<cfset security = createObject("java", "java.lang.System") />
<cfset security.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2") />

Полный код:

<cffunction name = "uploadFileToCloudStorage" access = "remote" returnformat = "JSON" returntype = "any">
    <cfargument name = "bucket_name" default = "" />
    <cfargument name = "object_name" default = "" />
    <cfargument name = "object_location" default = ""/>
    <cfargument name = "object_content_type" default = "" />
    <cfargument name = "access_token" required = "true" />

    <cfset fileContent = FileReadBinary('#arguments.object_location#') />
    
    <cfset endpoint = "https://storage.googleapis.com/upload/storage/v1/b/#arguments.bucket_name#/o?uploadType=media&name=#arguments.object_name#" />

    <cfset security = createObject("java", "java.lang.System") />
    <cfset security.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2") />
    
    <cfhttp result = "result" method = "POST" charset = "utf-8" url = "#endpoint#" timeout = "60">
        <cfhttpparam type = "header" name = "Authorization" value = "Bearer #arguments.access_token#" />
        <cfhttpparam type = "header" name = "Content-Type" value = "#arguments.object_content_type#" />
        <cfhttpparam type = "body" value = "#fileContent#" />
    </cfhttp>

    <cfreturn result />
</cffunction>

Как вы обнаружили, что проблема в этом? Какие версии ColdFusion и Java вы используете?

Adrian J. Moreno 09.07.2024 17:49

Я нашел это, исследуя ошибку Record_overflow. Было написано, что может быть проблема с TLS. Я попробовал, и это сработало. Сейчас это работает. КФ: 2021, Ява: 13

Alpasp 11.07.2024 10:51

Вы применили все обновления? Этот конкретно касается проблемы TLS. helpx.adobe.com/coldfusion/kb/coldfusion-2021-update-2.html

Adrian J. Moreno 11.07.2024 17:44

Другие вопросы по теме