21414


お世話になっております。

現在ServletからGoogleCloudStorageへの画像アップロード処理を試しているのですが、  
ファイルのアップロード自体は出来ているのですが、画像が壊れて？しまうようです。  
手動でGCSのブラウザからアップロードしたファイルはServletからGETで表示させることはできています。

環境  
Servlet: 2.5  
GAE: 1.9.25  
GCS Client Library: 0.5  
Maven: 3.3.3

upload処理

[code]

    private String bucketName = AppIdentityServiceFactory.getAppIdentityService().getDefaultGcsBucketName();
    private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder()
          .initialRetryDelayMillis(10)
          .retryMaxAttempts(10)
          .totalRetryPeriodMillis(15000)
          .build());
    private static final int BUFFER_SIZE = 2 * 1024 * 1024;
    ...//ServletのdoPost内
    GcsFilename filename = new GcsFilename(bucketName, directoryPath + "uploadfile.jpg");
    GcsFileOptions options = new GcsFileOptions.Builder().acl("public-read").mimeType("image/jpeg").build();
    try(OutputStream output = Channels.newOutputStream(outputChannel)) {
        try (InputStream input = request.getInputStream()) {
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = input.read(buffer);
            while (bytesRead != -1) {
                output.write(buffer,0,bytesRead);
                bytesRead = input.read(buffer);
            }
        }
    }
    
[/code]

GCSブラウザのアップロード状況(一番下のuploadfile.jpgがアップロードしたファイルです)  
[![GCSブラウザ画面スクリーンショット](https://i.stack.imgur.com/EgFjm.png)](https://i.stack.imgur.com/EgFjm.png)

ファイルをクリックするとブラウザ上では左上に四角の枠みたいなのが表示されるだけです。  
[![ブラウザスクリーンショット](https://i.stack.imgur.com/dcJU2.png)](https://i.stack.imgur.com/dcJU2.png)  
と表示されます。

画像のアップロードテストは  
curl [アプリケーションURL] -F file=@test.jpg  
としています。

GcsFileOptions.BuilderでmimeTypeを設定しないとタイプがbinary/octet-stremとなります。  
アップロードされた添付画像のファイルはサイズやタイプは正常だと思うのですが、どうしてこのように表示されてしまうのでしょうか？  
アップロードするには何か権限が必要なのでしょうか？  
公開するためのチェックボックスも消えてしまいます。

宜しくお願い致します。


CC BY-SA 3.0
2016-01-27T16:45:01.003
21404
2016-01-28T02:13:59.283
297
question
java google-app-engine java-ee servlet
GoogleCloudStorageにuploadしたファイルが表示されない。


request.getInputStream()をそのまま書き込んでしまっているので、curlで投げたForm全体をファイルとして書き込んじゃってるんだと思いま‌​す。

この質問とは関係ないですが、App EngineでGCS Client Library使うと、裏はURL
Fetchしているので、FileをUploadしたいだけなら、Blobstore API使った方が無難ですね。

僕はSlim3使ってますが、 <https://qiita.com/sinmetal/items/6ed7ec012af030f3e8fa> とか
<https://qiita.com/sinmetal/items/7d2617001494cd204255> を参考にどうぞ。


CC BY-SA 3.0
2016-01-28T02:13:59.283
21414
2016-01-28T02:13:59.283
4361
21404
answer