Невозможно загрузить более 50 КБ, используя XML API Google Cloud Storage POST. - PullRequest
0 голосов
/ 13 июня 2018

Я создал форму для загрузки файлов в Google Cloud Storage с использованием XML-API POST Object.

Это работает нормально, за исключением файлов, размер которых превышает 50 КБ.Я тестировал на Google Chrome и Firefox.

Вот HTML

    <form id="upload-form"
          method="POST"
          role="search">
      <div class="form-group">
        <label class="col-sm-2 control-label">File input</label>
        <div class="col-sm-10">
          <input type="file" class="filestyle"
                 name="file">
        </div>
      </div>
      <div class="form-group">
        <div class="col-sm-4 col-sm-offset-2">
          <button type="submit" class="btn btn-primary">Upload</button>
        </div>
      </div>
    </form>

Вот JavaScript

$(function () {
    $('#upload-form').submit(function (e) {
        e.preventDefault();
        $.post("/experimental/upload/signed-url").then(function (info) {

            var form = $('#upload-form')[0];
            var formData = new FormData(form);
            formData.append('googleAccessId', info.googleAccessId);
            formData.append('policy', info.policy);
            formData.append('signature', info.signature);
            formData.append('bucket', info.bucket);
            formData.append('key', info.key);
            formData.append('success_action_status', info.successActionStatus);
            $.ajax({
                url: info.url,
                data: formData,
                type: 'POST',
                contentType: false,
                processData: false,
            }).then(function (res2) {
                console.log(res2);
            });
        });
    });
});

Это конечная точка / экспериментальная / загрузка / подписанная-url создает ответы, подобные этому

    {
      "googleAccessId" : "xxxx",
      "policy" : "REDACTED",
      "signature" : "REDACTED",
      "successActionStatus" : "201",
      "url" : "https://storage.googleapis.com/my-bucket",
      "bucket" : "my-bucket",
      "key" : "path/file-name",
      "clientName" : null,
      "publicUrl" : "https://storage.googleapis.com/my-bucket/path/file-name"
    }

Код, который создает подпись, выглядит следующим образом

    try {
        byte[] policy = policyDocument.toJsonBytes();
        System.out.println(policyDocument.toJson());
        String encodedPolicy = BaseEncoding.base64().encode(policy);
        ServiceAccountCredentials cred = ServiceAccountCredentials
            .fromStream(new FileInputStream(googleCredentialsFile));
        byte[] signatureBytes = cred.sign(encodedPolicy.getBytes(Charsets.UTF_8));
        String signature = BaseEncoding.base64().encode(signatureBytes);
        info.setGoogleAccessId(cred.getAccount());
        info.setPolicy(encodedPolicy);
        info.setSignature(signature);
        info.setSuccessActionStatus(STATUS_CODE);
        info.setUrl(String.format(END_POINT_URL_FORMAT, info.getBucket()));
        return info;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

А вот как выглядит документ политики

  {
    "conditions": [
      {
        "success_action_status": "201"
      },
      {
        "bucket": "XXXXX"
      },
      {
        "key": "path/file-name"
      },
      [
        "content-length-range",
        0,
        1895825408
      ]
    ],
    "expiration": "2018-06-13T12:51:45.143+03:00"
  }

Для файлов размером более 50 КБ я получаю HTTP-статус 400 с этим телом

<?xml version="1.0" encoding="UTF-8"?>
<Error>
   <Code>InvalidArgument</Code>
   <Message>Invalid argument.</Message>
   <Details>Cannot create buckets using a POST.</Details>
</Error>

Есть ли кто-нибудь, кто может помочь мне загрузить более 50 КБ с этим?

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Сделайте ваше файловое поле последним полем формы, т.е.

  var frm = new FormData(this);
  var file_path = uploadForm.get("file");
  uploadForm.delete("file");
  uploadForm.append("file", file_path);
  ajax.send(uploadForm);
0 голосов
/ 31 июля 2018

Я с поддержкой GCP.Мы смогли получить одно и то же сообщение об ошибке, используя запрос POST на основе этой документации , независимо от размера файла.

Исправлено, как только мы изменили эквивалент на "url" : "https://storage.googleapis.com/my-bucket",, добавив объект: "url" : "https://storage.googleapis.com/my-bucket/my-file.ext",

Затем, используя POST, мы продолжали получать некоторые сообщения об ошибках, поэтому мы изменили метод на PUT.Тогда это сработало.

Не работает запрос локона:

curl -d @[FILENAME.EXT] @[JSONFILE.json] -X POST -H 'Authorization: Bearer [TOKEN]' http://[BUCKET_NAME].storage.googleapis.com/ 

Рабочий запрос локона:

curl -v H 'Authorization: Bearer [TOKEN]' -F upload=@[FILENAME.EXT] -X PUT http://[BUCKET_NAME].storage.googleapis.com/[FILENAME.EXT]

Я также попросил улучшить документацию с извлеченными уроками.

...