【问题标题】:How to insert a pdf file in Google Cloud Storage using Java如何使用 Java 在 Google Cloud Storage 中插入 pdf 文件
【发布时间】:2019-01-13 14:18:15
【问题描述】:

我一直在尝试使用我的应用程序在 Google Cloud Storage 上上传 pdf 文件,但我无法这样做。我在网上搜索并找到了以下给出的代码,但问题是此代码在上传 txt 时很有用文件但不是 pdf 文件。当我尝试上传 pdf 文件时,它会成功上传,但当我尝试打开它时,它不会打开。我正在使用以下代码:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
RequestDispatcher rd=req.getRequestDispatcher("career-registration-successfull.jsp");
RequestDispatcher rd1=req.getRequestDispatcher("career-registration-failed.jsp");
String name="";
String email="";
long whatsapp=0;
long number=0;
String query="";
int flag1=0;
int flag2=0;
isMultipart = ServletFileUpload.isMultipartContent(req);
resp.setContentType("text/html");
java.io.PrintWriter out = resp.getWriter( );
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Subhanshu Bigasia\\Desktop\\Amazon.pdf");
Storage storage = StorageOptions.getDefaultInstance().getService();
Bucket bucket=storage.get(("combucket1eduvitae7"));
ServletFileUpload sfu = new ServletFileUpload(new DiskFileItemFactory());
String targetFileStr="";
try {
    List<FileItem>  fileName = sfu.parseRequest(req);
     for(FileItem f:fileName)
        {
        try {
            f.write (new File("C:\\Users\\Subhanshu Bigasia\\Desktop\\Afcat.pdf"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //targetFileStr = readFile("/Users/tkmajdt/Documents/workspace/File1POC1/" + f.getName(),Charset.defaultCharset());
        targetFileStr = new String(Files.readAllBytes(Paths.get("C:\\Users\\Subhanshu Bigasia\\Desktop\\Afcat.pdf")));
        }
}
catch(Exception e) {
    e.printStackTrace();
}
BlobId blobId = BlobId.of("combucket1eduvitae", "my_blob_name1");
//Blob blob = bucket.create("my_blob_name1", targetFileStr.getBytes(), "text/plain");
Blob blob=bucket.create("myblob",fileInputStream, "text");

谁能帮忙解决这个问题。
提前谢谢你

【问题讨论】:

    标签: java eclipse file-upload google-cloud-platform google-cloud-storage


    【解决方案1】:

    我用下面的代码解决了这个问题:

    String name="";
    String email="";
    long whatsapp=0;
    long number=0;
    String query="";
    int flag1=0;
    int flag2=0;
    boolean isMultipart = ServletFileUpload.isMultipartContent(req);
    resp.setContentType("text/html");
    java.io.PrintWriter out = resp.getWriter( );
        if( !isMultipart ) {
       out.println("<html>");
       out.println("<head>");
       out.println("<title>Servlet upload</title>");  
       out.println("</head>");
       out.println("<body>");
       out.println("<p>No file uploaded</p>"); 
       out.println("</body>");
       out.println("</html>");
       return;
    }
    
    DiskFileItemFactory factory = new DiskFileItemFactory();
    
    // maximum size that will be stored in memory
    factory.setSizeThreshold(maxMemSize);
    
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    
    // maximum file size to be uploaded.
    upload.setSizeMax( maxFileSize );
    
    try { 
       // Parse the request to get file items.
       List fileItems = upload.parseRequest(req);
    
       // Process the uploaded file items
       Iterator i = fileItems.iterator();
    
       out.println("<html>");
       out.println("<head>");
       out.println("<title>Servlet upload</title>");  
       out.println("</head>");
       out.println("<body>");
    
       while ( i.hasNext () ) {
          FileItem fi = (FileItem)i.next();
          if ( !fi.isFormField () ) {
             // Get the uploaded file parameters
            try { String fieldName = fi.getFieldName();
             String fileName = fi.getName();
             String contentType = fi.getContentType();
             boolean isInMemory = fi.isInMemory();
             long sizeInBytes = fi.getSize();
             Date date=new Date();             
             System.out.println(("Uploaded Filename: " + fileName + "<br>"));
             flag1=1;
             File f1=new File("C:\\Users\\Subhanshu Bigasia\\Desktop\\amazon2.pdf");
             FileInputStream fileInputStream = (FileInputStream) fi.getInputStream();
             Storage storage = StorageOptions.getDefaultInstance().getService();
             Bucket bucket=storage.get(("combucket1eduvitae7"));
             ServletFileUpload sfu = new ServletFileUpload(new DiskFileItemFactory());
             BlobId blobId = BlobId.of("combucket1eduvitae", "my_blob_name1");
             //Blob blob = bucket.create("my_blob_name1", targetFileStr.getBytes(), "application/pdf");
             Blob blob=bucket.create(fileName+" "+date.toString(),fileInputStream,"application/pdf");
             flag1=1;
            }
            catch(Exception e) {
                flag1=0;
                e.printStackTrace();
            }
          }
    

    注意我用过
    Blob blob=bucket.create(fileName+" "+date.toString(),fileInputStream,"application/pdf");而不是
    Blob blob=bucket.create(fileName+" "+date.toString(),fileInputStream,"text/plain");

    【讨论】:

      【解决方案2】:

      首先关注Cloud Storage Client Libraries for Java documentation,这将使您入门。

      您可以尝试使用 Java (found here) 将文件上传到 Cloud Storage 存储桶的示例:

      /**
         * Uploads data to an object in a bucket.
         *
         * @param name the name of the destination object.
         * @param contentType the MIME type of the data.
         * @param file the file to upload.
         * @param bucketName the name of the bucket to create the object in.
         */
        public static void uploadFile(
            String name, String contentType, File file, String bucketName)
            throws IOException, GeneralSecurityException {
          InputStreamContent contentStream = new InputStreamContent(
              contentType, new FileInputStream(file));
          // Setting the length improves upload performance
          contentStream.setLength(file.length());
          StorageObject objectMetadata = new StorageObject()
              // Set the destination object name
              .setName(name)
              // Set the access control list to publicly read-only
              .setAcl(Arrays.asList(
                  new ObjectAccessControl().setEntity("allUsers").setRole("READER")));
      
          // Do the insert
          Storage client = StorageFactory.getService();
          Storage.Objects.Insert insertRequest = client.objects().insert(
              bucketName, objectMetadata, contentStream);
      
          insertRequest.execute();
        }
      

      您可以在 GitHub 存储库 here 中找到易于遵循的入门教程。请同时查看 Stack Overflow 线程 Upload image to Google Cloud Storage (Java)

      【讨论】:

      • 感谢@komarkovich 的回复,但我的问题已经解决了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2018-09-07
      • 2014-07-23
      相关资源
      最近更新 更多