Я пытаюсь загрузить 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, и результат все тот же.
Когда я публикую png-файл с изображением/png object_content_type, он работает нормально, приложение/pdf все еще выдает ту же ошибку.
Попробуйте загрузить PDF-файл и запустить эту функцию для файла, чтобы посмотреть, что она вернет. helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/…
Он возвращает приложение/pdf
Есть ли у вас ссылка на документацию по 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
Я использую этот: cloud.google.com/storage/docs/… ОТДЫХ.
Пробовали ли вы размещать те же файлы, используя пример CURL
из вашей ссылки?
Речь идет о проблеме TLS. Я разместил ответ на этот вопрос ниже.
Это проблема 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 вы используете?
Я нашел это, исследуя ошибку Record_overflow. Было написано, что может быть проблема с TLS. Я попробовал, и это сработало. Сейчас это работает. КФ: 2021, Ява: 13
Вы применили все обновления? Этот конкретно касается проблемы TLS. helpx.adobe.com/coldfusion/kb/coldfusion-2021-update-2.html
Можете ли вы опубликовать вызов функции для PDF и один для PNG? Кроме того, эти переменные должны иметь область действия
var
илиlocal
внутри функции.local.fileContent
,local.endpoint
иlocal.result
.