Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google云存储API和可恢复上传返回空位置头_Java_Google App Engine_Google Cloud Storage_Httpurlconnection - Fatal编程技术网

Java Google云存储API和可恢复上传返回空位置头

Java Google云存储API和可恢复上传返回空位置头,java,google-app-engine,google-cloud-storage,httpurlconnection,Java,Google App Engine,Google Cloud Storage,Httpurlconnection,我试图使用Google云存储JSON API获取可恢复上传的位置头,如下所述:,但我总是收到响应代码400的错误请求。我知道我在这条路上的某个地方犯了一个愚蠢的错误,但我就是看不到这是在哪里发生的,所以如果有人能成功地让这个工作,或者能指出我所缺少的东西,那将是一个很大的帮助 这是我的申请代码: private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage

我试图使用Google云存储JSON API获取可恢复上传的位置头,如下所述:,但我总是收到响应代码400的错误请求。我知道我在这条路上的某个地方犯了一个愚蠢的错误,但我就是看不到这是在哪里发生的,所以如果有人能成功地让这个工作,或者能指出我所缺少的东西,那将是一个很大的帮助

这是我的申请代码:

private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable"

public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
    String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
            getBucketForResourceType(resourceType).getBucketName());

    try {
        URL uploadURL = new URL(resumeableUploadURL);
        HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();

        connection.setRequestMethod("POST");
        connection.setRequestProperty("X-Upload-Content-Type", contentType);
        connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
        connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

        String json = "{\"name\":\"" + filename + "\"}";
        connection.setRequestProperty("Content-Length", String.valueOf(json.getBytes().length));

        List<String> scopes = new ArrayList<>();
        scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
        AppIdentityService.GetAccessTokenResult accessToken =
                AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
        connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
        connection.connect();

        if (connection.getResponseCode() >= 400) {
            log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
            log.debug(connection.getResponseMessage());
            throw new NotFoundException("Object at url: " + resumeableUploadURL +
                    " returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
        }

        String responseMessage = connection.getResponseMessage();
        String locationHeader = connection.getHeaderField("Location");
        log.debug("Upload request response: " + responseMessage + " Location header: " + locationHeader);
        return locationHeader;

    } catch (MalformedURLException e) {
        log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
        throw new InternalServerException("Unable to complete upload request", e);
    } catch (IOException e) {
        log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
        throw new InternalServerException("Unable to complete upload request", e);
    }
}
private static final String RESUMEABLE\u UPLOAD\u URL\u FORMAT=”https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable"
公共字符串GetLocationForResumableUpload(字符串文件名、ResourceType ResourceType、String contentType、Long contentLength)引发EndpointException异常{
String resumeableUploadURL=String.format(可恢复上传URL格式,
getBucketForResourceType(resourceType).getBucketName());
试一试{
URL uploadURL=新URL(resumeableUploadURL);
HttpURLConnection connection=(HttpURLConnection)uploadURL.openConnection();
connection.setRequestMethod(“POST”);
connection.setRequestProperty(“X-Upload-Content-Type”,contentType);
connection.setRequestProperty(“X-Upload-Content-Length”,“”+contentLength);
setRequestProperty(“内容类型”,“应用程序/json;字符集=UTF-8”);
字符串json=“{\'name\”:\”“+filename+“\”}”;
setRequestProperty(“Content-Length”,String.valueOf(json.getBytes().Length));
列表范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken=
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(作用域);
setRequestProperty(“授权”、“承载者”+accessToken.getAccessToken());
connection.connect();
if(connection.getResponseCode()>=400){
调试(“与accessToken的连接失败:+accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
抛出新的NotFoundException(“url处的对象:”+ResumableUploadURL+
返回响应代码:“+connection.getResponseCode()+”响应消息:“+connection.getResponseMessage());
}
字符串responseMessage=connection.getResponseMessage();
字符串locationHeader=connection.getHeaderField(“位置”);
log.debug(“上传请求响应:+responseMessage+”位置头:+locationHeader”);
返回位置标题;
}捕获(格式错误){
log.error(“URL格式错误:+ResumableUploadURL+“无法获取可恢复上传URL”,e);
抛出新的InternalServerException(“无法完成上传请求”,e);
}捕获(IOE异常){
log.error(“无法从GCS获取上传URL:+ResumableUploadURL,e”);
抛出新的InternalServerException(“无法完成上传请求”,e);
}
}

更新1:结果发现我的代码中有一个bug,我正在检查响应代码>400,请求返回响应代码:400-错误请求。现在我的问题是,为什么我的请求不正确?

因此,需要将对象的名称放入查询字符串中,如下所示:

private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable&name=%s"
public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
    String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
            getBucketForResourceType(resourceType).getBucketName(), filename);

    try {
        URL uploadURL = new URL(resumeableUploadURL);
        HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();

        connection.setRequestMethod("POST");
        connection.setRequestProperty("X-Upload-Content-Type", contentType);
        connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
        connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        connection.setRequestProperty("Content-Length", String.valueOf(0));

        List<String> scopes = new ArrayList<>();
        scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
        AppIdentityService.GetAccessTokenResult accessToken =
                AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
        connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
        connection.connect();

        if (connection.getResponseCode() >= 400) {
            log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
            log.debug(connection.getResponseMessage());
            throw new NotFoundException("Object at url: " + resumeableUploadURL +
                    " returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
        }

        String responseMessage = connection.getResponseMessage();
        String locationHeader = connection.getHeaderField("Location");
        log.debug("Upload request response " + connection.getResponseCode() + " : " + responseMessage + " Location header: " + locationHeader);
        return locationHeader;

    } catch (MalformedURLException e) {
        log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
        throw new InternalServerException("Unable to complete upload request", e);
    } catch (IOException e) {
        log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
        throw new InternalServerException("Unable to complete upload request", e);
    }
}
因此,完整的代码如下所示:

private static final String RESUMEABLE_UPLOAD_URL_FORMAT = "https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable&name=%s"
public String getLocationForResumeableUpload(String filename, ResourceType resourceType, String contentType, Long contentLength) throws EndpointException {
    String resumeableUploadURL = String.format(RESUMEABLE_UPLOAD_URL_FORMAT,
            getBucketForResourceType(resourceType).getBucketName(), filename);

    try {
        URL uploadURL = new URL(resumeableUploadURL);
        HttpURLConnection connection = (HttpURLConnection) uploadURL.openConnection();

        connection.setRequestMethod("POST");
        connection.setRequestProperty("X-Upload-Content-Type", contentType);
        connection.setRequestProperty("X-Upload-Content-Length", "" + contentLength);
        connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        connection.setRequestProperty("Content-Length", String.valueOf(0));

        List<String> scopes = new ArrayList<>();
        scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
        AppIdentityService.GetAccessTokenResult accessToken =
                AppIdentityServiceFactory.getAppIdentityService().getAccessToken(scopes);
        connection.setRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
        connection.connect();

        if (connection.getResponseCode() >= 400) {
            log.debug("connection failed with accessToken: " + accessToken.getAccessToken());
            log.debug(connection.getResponseMessage());
            throw new NotFoundException("Object at url: " + resumeableUploadURL +
                    " returns response code: " + connection.getResponseCode() + " response message: " + connection.getResponseMessage());
        }

        String responseMessage = connection.getResponseMessage();
        String locationHeader = connection.getHeaderField("Location");
        log.debug("Upload request response " + connection.getResponseCode() + " : " + responseMessage + " Location header: " + locationHeader);
        return locationHeader;

    } catch (MalformedURLException e) {
        log.error("URL Malformed: " + resumeableUploadURL + " unable to fetch resumeable upload url", e);
        throw new InternalServerException("Unable to complete upload request", e);
    } catch (IOException e) {
        log.error("Unable to fetch upload URL from GCS: " + resumeableUploadURL, e);
        throw new InternalServerException("Unable to complete upload request", e);
    }
}
公共字符串GetLocationForResumableUpload(字符串文件名、ResourceType ResourceType、String contentType、Long contentLength)引发EndpointException{
String resumeableUploadURL=String.format(可恢复上传URL格式,
getBucketForResourceType(resourceType).getBucketName(),文件名);
试一试{
URL uploadURL=新URL(resumeableUploadURL);
HttpURLConnection connection=(HttpURLConnection)uploadURL.openConnection();
connection.setRequestMethod(“POST”);
connection.setRequestProperty(“X-Upload-Content-Type”,contentType);
connection.setRequestProperty(“X-Upload-Content-Length”,“”+contentLength);
setRequestProperty(“内容类型”,“应用程序/json;字符集=UTF-8”);
connection.setRequestProperty(“内容长度”,String.valueOf(0));
列表范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService.GetAccessTokenResult accessToken=
AppIdentityServiceFactory.getAppIdentityService().getAccessToken(作用域);
setRequestProperty(“授权”、“承载者”+accessToken.getAccessToken());
connection.connect();
if(connection.getResponseCode()>=400){
调试(“与accessToken的连接失败:+accessToken.getAccessToken());
log.debug(connection.getResponseMessage());
抛出新的NotFoundException(“url处的对象:”+ResumableUploadURL+
返回响应代码:“+connection.getResponseCode()+”响应消息:“+connection.getResponseMessage());
}
字符串responseMessage=connection.getResponseMessage();
字符串locationHeader=connection.getHeaderField(“位置”);
log.debug(“上传请求-响应”+连接.getResponseCode()+”:“+responseMessage+”位置头:“%+locationHeader”);
返回位置标题;
}捕获(格式错误){
log.error(“URL格式错误:+ResumableUploadURL+“无法获取可恢复上传URL”,e);
抛出新的InternalServerException(“无法完成上传请求”,e);
}捕获(IOE异常){
log.error(“无法从GCS获取上传URL:+ResumableUploadURL,e”);
抛出新的InternalServerException(“无法完成上传请求”,e);
}
}