如何将 azure-storage 实现到 vaadin 框架中

How to implement azure-storage into vaadin framework

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

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

我的问题陈述如下:

下面是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();
        }

    }

}

现在,我正在传递手动文件 PATH 如上所述上传到 azure blob,正如我上面所说的,这个 class 被调用直到代码行 System.out.println("---I am getting called 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 class.

其次,当我尝试浏览文件时,文件被选中但是当我点击上传时,我在 Vaadin 上传 UI 部分得到 NullPointerException,即使我选择了文件,UI说 "no file choosen"

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

首先,上传是Vaadin的一个组件。您不应该创建自己的上传 class。

其次,public静态main方法是程序启动的入口。如果你想使用class的方法,你需要显式地调用它。

TheClassName.MethodName(...) // For static method
new TheClassName(...).MethodName(...) //For non-static method

第三,我做了一些测试,下面是一个成功的例子。将创建两个 classes:


Class 上传接收器

这个 class 实现了 Receiver 接口和一些侦听器。

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);
    }
}

Class 主要UI

这是 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);
    }
}

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

并且,通过使用存储资源管理器检查存储帐户,我可以看到文件已成功上传:


更新:

上传是这样的:

不知道你的代码是怎么通过编译的。要构建上传 object,您需要传递一个标题字符串和一个实现 Upload.Receiver 接口的接收器。

public Upload(String caption, Receiver uploadReceiver)

要实现Upload.Receiver 接口,您必须重写receiveUpload 方法。

OutputStream receiveUpload(String filename, String mimeType)

receiveUpload 将 return 一个输出流,vaadin 最终会将内容写入其中。

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

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