如何在JSF中生成和预览文件的预设URL?
我正在尝试使用JSF预览任何类型的文件,例如Image,PDF,DOC,ODT,XLSX,CSV,CSV,文本等。
我的代码流:
- 使用AWS S3存储桶Java SDK生成预先签名的URL。
- 然后将其传递给Google Doc或Microsoft API进行预览。
生成预先签名URL的代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.Duration;
import java.util.Date;
import java.util.logging.Level;
import org.apache.tika.Tika;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
.........
.........
.........
public void awsService(){
AwsCredentialsProvider acp = StaticCredentialsProvider.create(AwsBasicCredentials.create("AccesId", "Key"));
String fileName = "dummy.pdf";
String bucketName = "ViewerBucket";
File file = new File("some/path/to/file/dummy.pdf");
if (file.exists()) {
//uploading file before getting pre-signed url
PutObjectResponse response = s3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key(fileName)
.contentType(tika.detect(file)).contentDisposition("attachment; filenName=\"" + fileName + "\"").build(),
RequestBody.fromFile(file)); //incontentDisposition tried with attachment/inline
S3Presigner presigner = S3Presigner.builder()
.credentialsProvider(acp)
.region(Region.US_EAST_1)
.build();
signBucket(presigner, bucketName, fileName, file, new Tika().detect(file));
getPresignedUrl(presigner, bucketName, fileName);
}
}
public void getPresignedUrl(S3Presigner presigner, String bucketName, String keyName) {
try {
GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(keyName).build();
GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder().signatureDuration(Duration.ofMinutes(10))
.getObjectRequest(getObjectRequest).build();
// Generate the presigned request
PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest);
// Log the presigned URL
System.out.println("Presigned URL: " + presignedGetObjectRequest.url()); //This url also has same issue with image and pdf as mentioned above
} catch (Exception e) {
e.printStackTrace();
}
}
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.16.60</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
和
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
我尝试了许多解决方案,但是预览在浏览器和代码中都无法使用。
我现在已经编辑了我的问题,我正在获得URL,而PDF正在浏览器中打开,但是当我传递给Google文档时,显示为预览不可用 当通过Microsoft Doc中显示为文件时,找不到。 但是在浏览器中正在预览相同的PDF链接。
请引导我或告诉我我在哪里错了。将要提前感谢Anyhelp。
与之合作 JSF 2和PrimeFaces 6.2
I am trying to preview any type of file such as image,pdf,doc,odt,xlsx,csv,text etc in my web app using jsf.
My flow of code:
- Generating a presigned url using aws s3 bucket, java sdk.
- Then passing this to google doc or microsoft API to preview.
Code of generating presigned url
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.Duration;
import java.util.Date;
import java.util.logging.Level;
import org.apache.tika.Tika;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
.........
.........
.........
public void awsService(){
AwsCredentialsProvider acp = StaticCredentialsProvider.create(AwsBasicCredentials.create("AccesId", "Key"));
String fileName = "dummy.pdf";
String bucketName = "ViewerBucket";
File file = new File("some/path/to/file/dummy.pdf");
if (file.exists()) {
//uploading file before getting pre-signed url
PutObjectResponse response = s3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key(fileName)
.contentType(tika.detect(file)).contentDisposition("attachment; filenName=\"" + fileName + "\"").build(),
RequestBody.fromFile(file)); //incontentDisposition tried with attachment/inline
S3Presigner presigner = S3Presigner.builder()
.credentialsProvider(acp)
.region(Region.US_EAST_1)
.build();
signBucket(presigner, bucketName, fileName, file, new Tika().detect(file));
getPresignedUrl(presigner, bucketName, fileName);
}
}
public void getPresignedUrl(S3Presigner presigner, String bucketName, String keyName) {
try {
GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(keyName).build();
GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder().signatureDuration(Duration.ofMinutes(10))
.getObjectRequest(getObjectRequest).build();
// Generate the presigned request
PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest);
// Log the presigned URL
System.out.println("Presigned URL: " + presignedGetObjectRequest.url()); //This url also has same issue with image and pdf as mentioned above
} catch (Exception e) {
e.printStackTrace();
}
}
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.16.60</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
and
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
I tried many solutions and many ways but preview is not working in browser as well as in code.
I edited my question now I am getting url and pdf is opening in browser but when I passing to google doc showing as preview not available
and when passing in microsoft doc showing as file not found.
but the same pdf link is previewing in browser.
Please guide me or tell me where am I wrong. Anyhelp will be appreciated Thanks alot in advance.
working with
Jsf 2 and primefaces 6.2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
经过艰苦的搜索,
主要是解决了解决方案之后,我忘了传递办公室API时编码URL。
After a hard and searching Got the solution
Mainly I forgot to encode the url while passing in office API's.