2

将图像发布到谷歌驱动器时遇到以下问题:

java.io.IOException: insufficient data written
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.close(HttpURLConnection.java:2822)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:83)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:895)
at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:280)
at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:309)
at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)

我相信它与此有关:http ://code.google.com/p/google-api-java-client/issues/detail?id=521

有没有办法绕过这个?我想知道是否可以在不使用谷歌驱动器 sdk 的可恢复上传 api 的情况下插入文件?

4

2 回答 2

2

我相信我回答了我自己关于如何直接上传的问题:

Insert insert = this.driveClient.files().insert(body, mediaContent);
insert.getMediaHttpUploader().setDirectUploadEnabled(true);
File result = insert.execute();

但是,仍然不确定数据写入不足错误的原因。

于 2012-07-14T02:48:04.820 回答
0

使用 setDirectUploadEnabled(false) 选项,insert.execute() 立即开始上传第一个块,我的意思是在获得最小块大小之前。您必须完成 request.getPart("fleInputName") 然后开始驱动器上传过程。

我用这样的阻塞线程解决了这个问题:

public class GetPartThread  extends Thread {

        private HttpServletRequest request;
        private String inputAttr;

        private Part part;



        public GetPartThread(HttpServletRequest request, String inputAttr) {
            super();
            this.request = request;
            this.inputAttr = inputAttr;
        }


        @Override
        public void run(){
                synchronized(this){
                    try {
                        part = request.getPart(inputAttr);
                        notify();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
        }

        public Part getPart() {
            return part;
        }

        public void setPart(Part part) {
            this.part = part;
        }

然后将它与您的驱动器上传方法一起使用:

GetPartThread getPart = new GetPartThread(request, "templatefile");
getPart.start();
synchronized(getPart){
try{
    System.out.println("Waiting for Part upload to complete...");
    getPart.wait();
}catch(InterruptedException e){
    e.printStackTrace();
}
System.out.println("Part upload Finished...");

Part part = getPart.getPart();

//Here continue with processing your "part" and upload it to drive with the method you set for uploading to drive ... }

这应该有效。

注意:在使用 Drive Resumable Media Uploads 时不要使用 setConvert(true) 这将引发异常,因为转换开始于上传到驱动器的第一个块,而不是在上传完成后。

于 2015-06-12T05:50:59.417 回答