使用Google云端存储HTML表单的POST / PUT对象上传文件

时间:2014-04-19 09:45:16

标签: html post file-upload google-cloud-storage

我正在使用适用于Eclipse的Google-App-Engine插件开发一个非常简单的Web应用程序。 我刚刚在我的" home.html"的HTML中编写了这段代码。

这里home.html是:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Insert title here</title>
</head>
<body>
<form action="http://storage.googleapis.com/myBucketName" method="post" name="putFile" id="putFile"
            enctype="multipart/form-data">
            <input type="hidden" name="key" value="I don't know what is going here because i cannot guess which file i will upload" />
            <input type="hidden" name="success_action_status" value="201" />
            <input type="file" name="file" id="file">
            <input type="submit" value="Upload">
        </form>
</body>
</html>

这是一个非常简单的表格,没有任何授权或其他任何内容。 对于Info,您可以看到:https://developers.google.com/storage/docs/reference-methods#postobject(我已经记住了)。

我有来自Google的不同响应错误(XML格式),如:

1)

<Error>
<Code>InvalidArgument</Code>
<Message>Invalid argument.</Message>
<Details>Missing file part</Details>
</Error>

2)

<Error>
<Code>InvalidArgument</Code>
<Message>Invalid argument.</Message>
<Details>Cannot create buckets using a POST.</Details>
</Error>

3)

<Error>
<Code>InvalidArgument</Code>
<Message>Invalid argument.</Message>
<Details>
Invalid query parameter(s): [file, success_action_status, key]
</Details>
</Error>

有人可以帮我填写此表吗?

更具体一点: 它适用于这种形式:

<form action="http://storage.googleapis.com/bucketName" method="post" name="putFile" id="putFile"
            enctype="multipart/form-data">
            <input type="hidden" name="bucket" value="bucketName">
            <input type="hidden" name="key" value="fileUploadingName" />
            <input type="hidden" name="success_action_status" value="201" />
            <input type="file" name="file">
            <input type="submit" value="Upload">
        </form>

fileUploadingName例如:sample.txt

但问题仍然存在,因为我需要填写正确的&#34;密钥&#34;这是我要上传的文件的名称。我该如何解决?

3 个答案:

答案 0 :(得分:3)

这是一个工作表单示例:

<form action="http://storage.googleapis.com/bucketName" 
      method="post" enctype="multipart/form-data">
    <input type="hidden" name="key" value="${filename}" />
    <input type="hidden" name="success_action_status" value="201" />
    <input type="file" name="file">
    <input type="submit" value="Upload">
</form>

请注意,由于存储区名称已包含在POST网址中,因此没有隐藏的bucket字段。

关键参数可以是${filename},它将采用正在上传的文件的原始名称。虽然如果您尝试上传两个具有相同名称的文件,则会被另一个文件覆盖。

另外,请不要忘记你的存储桶需要有PUBLIC_WRITE acl。您可以使用gsutil设置它,例如:

gsutil acl set public-read-write gs://bucketName

答案 1 :(得分:1)

可以在不允许公开写入的情况下上传文件。我发现使用Google Cloud Platform的AWS S3互操作性更容易,因为它使用比典型的GCloud OAuth更简单的身份验证方案。

要使用S3互操作,请转到Bucket Settings in the Google Cloud Platform Developer Console,然后点击互操作性。启用互操作性并生成密钥。

此时,您可以使用S3的任何常见上传方案,同时替换这些gcloud互操作凭据,并将端点更改为storage.googleapis.com

答案 2 :(得分:0)

<Details>Cannot create buckets using a POST.</Details>

可以意味着:

  • 文件参数必须在最后。
  • 内容类型必须是multipart / form-data
  • 只允许一个文件
  • 应填写
  • 密钥或文件名(在文件表单字段中)