Java 如何在vaadin框架中实现azure存储
我正在尝试将文件上载到Azure Blob。 我正试图通过在vaadin框架中上传来实现。瓦丁版本:6.7.8 我能够开发一个将文件上传到azure blob的代码 我的问题陈述如下: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]中创
- 我已经编写了一个UploadToBlob.java类来将文件上载到azure blob中
- 如果我单独运行UploadToBlob.java类(从eclipse运行java应用程序运行),我就能够将文件上载到azure blob中
- 如果我在另一个类[ModifyComplaintComponent.java]中创建UploadToBlob类的对象,
storageAccount=CloudStorageAccount.parse(storageConnectionString)代码>未得到执行
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)
,即使我选择了文件,它也会显示为无文件。