如何将 azure-storage 实现到 vaadin 框架中
How to implement azure-storage into vaadin framework
我正在尝试将文件上传到 Azure Blob。
我正在尝试通过 vaadin 框架中的上传来实现。 Vaadin 版本:6.7.8
我能够开发将文件上传到 azure blob 的代码。
我的问题陈述如下:
- 我写了一个 class UploadToBlob.java 来上传文件到 azure blob。
- 如果我 运行 class UploadToBlob.java 单独(运行 来自 eclipse 运行 作为 java 应用程序),我能够将文件上传到 azure blob。
- 如果我在另一个 class[ModifyComplaintComponent.java] 中创建 UploadToBlob class 的对象,
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();
}
}
}
现在,我正在传递手动文件 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中手动设置输入内容的方法。对不起。
我正在尝试将文件上传到 Azure Blob。 我正在尝试通过 vaadin 框架中的上传来实现。 Vaadin 版本:6.7.8
我能够开发将文件上传到 azure blob 的代码。
我的问题陈述如下:
- 我写了一个 class UploadToBlob.java 来上传文件到 azure blob。
- 如果我 运行 class UploadToBlob.java 单独(运行 来自 eclipse 运行 作为 java 应用程序),我能够将文件上传到 azure blob。
- 如果我在另一个 class[ModifyComplaintComponent.java] 中创建 UploadToBlob class 的对象,
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();
}
}
}
现在,我正在传递手动文件 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中手动设置输入内容的方法。对不起。