Java 如何在vaadin框架中实现azure存储

Java 如何在vaadin框架中实现azure存储,java,azure,vaadin,azure-storage,azure-storage-blobs,Java,Azure,Vaadin,Azure Storage,Azure Storage Blobs,我正在尝试将文件上载到Azure Blob。 我正试图通过在vaadin框架中上传来实现。瓦丁版本:6.7.8 我能够开发一个将文件上传到azure blob的代码 我的问题陈述如下: 我已经编写了一个UploadToBlob.java类来将文件上载到azure blob中 如果我单独运行UploadToBlob.java类(从eclipse运行java应用程序运行),我就能够将文件上载到azure blob中 如果我在另一个类[ModifyComplaintComponent.java]中创

我正在尝试将文件上载到Azure Blob。 我正试图通过在vaadin框架中上传来实现。瓦丁版本:6.7.8

我能够开发一个将文件上传到azure blob的代码

我的问题陈述如下:

  • 我已经编写了一个UploadToBlob.java类来将文件上载到azure blob中
  • 如果我单独运行UploadToBlob.java类(从eclipse运行java应用程序运行),我就能够将文件上载到azure blob中
  • 如果我在另一个类[ModifyComplaintComponent.java]中创建UploadToBlob类的对象,
    storageAccount=CloudStorageAccount.parse(storageConnectionString)未得到执行
下面是UploadToBlob.java代码:

    package com.---.trs.scms.ui.components;

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageCredentials;
import com.microsoft.azure.storage.blob.CloudBlobContainer;

public class UploadToBlob {

    public static void main(String[] args) {

        try {

            final String storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=abcd;AccountKey=bmiA7+****==;EndpointSuffix=core.windows.net";
            System.out.println("---I am getting called Main-1 ");

            CloudStorageAccount storageAccount;

            storageAccount = CloudStorageAccount.parse(storageConnectionString);

            com.microsoft.azure.storage.blob.CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

            CloudBlobContainer container = blobClient.getContainerReference("container2");

            container.createIfNotExists();

            String filePath = "C:\\Users\\----\\Desktop\\Timesheet - 19th Aug,2019.pdf";

            com.microsoft.azure.storage.blob.CloudBlockBlob blob = container.getBlockBlobReference("Timesheet.pdf");

            java.io.File source = new java.io.File(filePath);

            java.io.FileInputStream fileInputStream = new java.io.FileInputStream(source);

            blob.upload(fileInputStream, source.length());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
现在,我正在通过上面的手动文件路径上传到azure blob中,正如我前面所说的,这个类一直被调用到代码
System.out.println(“---我被称为Main-1”)

下面是ModifyComplaintComponent代码,我从中调用UploadToBlob.java:

import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Upload;

public class ModifyComplaintComponent extends CustomComponent {


//other component  code which I haven't pasted here
    private Upload uploadnew;

    try {
            System.out.println("------Inside try block-----------");
            UploadToBlob fileReceiver= new UploadToBlob ();

            uploadnew = new Upload("Upload a file", fileReceiver);

            uploadnew.setReceiver(fileReceiver);
            uploadnew.addListener(fileReceiver);

            System.out.println("------end of try block-----------");
        }  catch (Exception e) {
            System.out.println("------catch block-----------");
            e.printStackTrace();

        } 

        HorizontalLayout hlayout = new HorizontalLayout();
        hlayout.setSpacing(true);
        hlayout.addComponent(uploadnew);

}
我之所以在UploadToBlob代码中提供手动文件路径,是因为我首先希望从ModifyComplaintComponent类调用此代码

第二,当我尝试浏览文件时,文件被选中,但当我单击upload时,我会在Vaadin upload UI部件上得到NullPointerException,即使我选择了文件,UI也会显示“no file choosen”


我面临的挑战是,如果我单独运行Upload.java文件,我可以将静态文件上载到azure blob中,但我想浏览vaadin框架中的文件并将其上载到azure blob存储中。

首先,上载是vaadin的一个组件。您不应该创建自己的上载类

其次,publicstaticmain方法是程序开始的入口。如果要使用类的方法,则需要显式调用它

TheClassName.MethodName(...) // For static method
new TheClassName(...).MethodName(...) //For non-static method
第三,我做了一些测试,下面是一个成功的例子。将创建两个类:


类上传接收器

此类实现接收器接口和一些侦听器

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.vaadin.ui.Upload;
import org.springframework.stereotype.Component;

import java.io.OutputStream;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;

@Component
public class UploadReceiver implements Upload.Receiver, Upload.StartedListener, Upload.SucceededListener, Upload.ProgressListener {
    // Storage account connection string.
    public static String conn = "DefaultEndpointsProtocol=https;AccountName=stora***789;AccountKey=G3***w==;EndpointSuffix=core.windows.net";

    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        System.out.println("Uploading -> " + mimeType + " ; File name -> " + filename);
        return GetOutputStream("vaadin",filename);
    }

    @Override
    public void uploadStarted(Upload.StartedEvent startedEvent) {
        System.out.println("Upload started!");
    }

    @Override
    public void uploadSucceeded(Upload.SucceededEvent succeededEvent) {
        System.out.println("Upload succeeded!");
    }


    public OutputStream GetOutputStream(String container, String blob){
        OutputStream outputStream = null;
        try{
            CloudStorageAccount storageAccount = CloudStorageAccount.parse(conn);
            CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.getContainerReference(container);
            CloudBlockBlob cloudBlockBlob = blobContainer.getBlockBlobReference(blob);
            outputStream = cloudBlockBlob.openOutputStream();
        } catch (StorageException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return outputStream;
    }

    @Override
    public void updateProgress(long readBytes, long contentLength) {
        System.out.println("Progress: readBytes -> " + readBytes + " ; contentLength -> " + contentLength);
    }
}

类MainUI

这是UI页面。我只是添加了一个上传组件

import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.UI;
import com.vaadin.ui.Upload;
import com.vaadin.ui.VerticalLayout;
import org.springframework.beans.factory.annotation.Autowired;

@SpringUI
public class MainUI extends UI {

    private VerticalLayout layout;
    private Upload upload;

    private UploadReceiver uploadReceiver;

    @Autowired
    public MainUI(UploadReceiver uploadReceiver){
        this.uploadReceiver = uploadReceiver;
    }

    @Override
    protected void init(VaadinRequest vaadinRequest) {

        // Set layout
        layout = new VerticalLayout();
        layout.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
        setContent(layout);


        // Add upload
        upload = new Upload("Upload a file", uploadReceiver);
        upload.addStartedListener(uploadReceiver);
        upload.addSucceededListener(uploadReceiver);
        upload.addProgressListener(uploadReceiver);
        layout.addComponent(upload);
    }
}

结果: 单击上载按钮并选择要上载的文件后,我可以从控制台获得以下输出:

而且,通过使用storage Explorer检查存储帐户,我可以看到文件已成功上载:


更新:

上传过程如下:

我不知道你的代码是如何通过编译的。要构造上载对象,需要传递一个标题字符串和一个实现Upload.receiver接口的接收器

public Upload(String caption, Receiver uploadReceiver)
要实现Upload.Receiver接口,必须重写receiveUpload方法

OutputStream receiveUpload(String filename, String mimeType)
receiveUpload将返回一个输出流,vaadin将最终在其中写入内容

就这些。给vaadin一个输出流,它会将所有内容写入该流


输入文件从浏览器发送,由vaadin处理。我没有找到在vaadin中手动设置输入内容的方法。对不起

顺便说一句,我使用了vaadin 8。Java知道我,但vaadin不知道我,我尝试使用您的代码实现,我在upload.addStartedListener(uploadReceiver)时出错;错误是:类型Upload的addSucceededListener(UploadReceiver)方法未定义。是因为我使用的是低于Vaadin 8,还是如果是,如何升级?感谢检查pom.xml,并更改vaadin的版本。顺便说一句,SucceededListener不是必需的,我只是用它来显示上传流程。receiveUpload方法是最重要的。@JackJia:我也在努力解决类似的问题,在我的例子中是Azure服务总线。我的项目是使用jar(即我没有任何pom.xml)设置Vaadin Base。是否有任何方法可以在不更改vaadin的版本的情况下执行azure操作???@JackJia我了解,为了上传,我在UI部分对这些侦听器进行了注释,当我单击“选择文件”时,文件被选中,就在我点击Upload时,我得到的错误是:
com.vaadin.terminal.gwt.server.UploadException:Upload失败,原因是:com.vaadin.ui上的java.lang.NullPointerException.Upload$1.getOutputStream(Upload.java:1007)
,即使我选择了文件,它也会显示为无文件。