从JavaServlet上传到Google云存储时图像损坏

从JavaServlet上传到Google云存储时图像损坏,java,google-app-engine,google-cloud-storage,xmlhttprequest-level2,Java,Google App Engine,Google Cloud Storage,Xmlhttprequest Level2,我正在为一个Javaservlet开发代码,用于处理表单图像帖子,并将该图像上传到Google云存储。我可以通过ajax调用POST、XMLHttpRequest和FormData上传图像。我所面临的是,大多数存储的图像都已损坏,无法打开。 就像这个()一样,但映像在我的文件系统上是正常的。 这可能是处理servlet代码中的流时出错吗 以下是servlet代码: protected void doPost(HttpServletRequest request, HttpServ

我正在为一个Javaservlet开发代码,用于处理表单图像帖子,并将该图像上传到Google云存储。我可以通过ajax调用POST、XMLHttpRequest和FormData上传图像。我所面临的是,大多数存储的图像都已损坏,无法打开。 就像这个()一样,但映像在我的文件系统上是正常的。 这可能是处理servlet代码中的流时出错吗

以下是servlet代码:

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");

    String ajaxUpdateResult = "";
    ServletFileUpload upload = new ServletFileUpload();
    String filePath = "";

    try {
        FileItemIterator iter = upload.getItemIterator(request);

        while (iter.hasNext()) {
            FileItemStream item = iter.next();

            String fileName = item.getName();
            System.out.println("Nome ficheiro->" + fileName);
            String mimeType = item.getContentType();
            System.out.println("mimeType->" + mimeType);
            InputStream content = item.openStream();

            // Process the input stream
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int len;
            byte[] buffer = new byte[8192];
            while ((len = content.read(buffer, 0, buffer.length)) != -1) {
                baos.write(buffer, 0, len);
            }
            int maxFileSize = 10 * (1024 * 1024); // 10 megs max
            if (baos.size() > maxFileSize) {
                throw new RuntimeException("File is > than " + maxFileSize);
            }

            FileService fileService = FileServiceFactory.getFileService();

            java.util.Date date = new java.util.Date();
            java.sql.Timestamp timeStamp = new Timestamp(date.getTime());
            System.out.println("DEBUG:upload timeStamp->" + timeStamp);

            GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
                    .setBucket(BUCKETNAME).setKey(fileName)
                    .setMimeType(mimeType).setAcl("public_read")
                    .addUserMetadata("uploadTimeStamp", timeStamp.toString());
            AppEngineFile writableFile = fileService
                    .createNewGSFile(optionsBuilder.build());

            // Open a channel to write to it
            boolean lock = true;
            FileWriteChannel writeChannel = fileService.openWriteChannel(
                    writableFile, lock);
            // Different standard Java ways of writing to the channel
            // are possible.

            // This time we write to the channel directly
            writeChannel.write(ByteBuffer.wrap(buffer));

            // Now finalize
            writeChannel.closeFinally();
            filePath = writableFile.getFullPath();

            // Do whatever with the content InputStream.
            // System.out.println(Streams.asString(content));//binary

            ajaxUpdateResult += "File " + fileName
                    + " is successfully uploaded\n\r";

        }

    } catch (FileUploadException e) {
        throw new ServletException("Parsing file upload failed.", e);
    }
    org.json.JSONObject json = new JSONObject();
    try {
        json.put("operationStatus", "SUCCESS");
        json.put("operationExecuted", "POST_TO_GCS");
        json.put("filePath", filePath);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    System.out.println("DEBUG:" + json.toString());
    log.info("LOGGER" + json.toString());
    response.getWriter().println(json.toString());
    response.getWriter().print(ajaxUpdateResult);
}

本地文件系统上的映像大小为123 KB,而谷歌云存储上的映像大小仅为8k。这样调用:
code
writeChannel.write(ByteBuffer.wrap(baos.toByteArray());而不是:
code
writeChannel.write(ByteBuffer.wrap(buffer));上传图像没有问题!这是一个解决方案吗?是的,您包装了错误的缓冲区。