To get HTTP links with direct link to file (with NAME and EXTENSION)
like http://website.com/file.avi could be done with
URL FileLocation = new URL("string");
String Name = FileLocation.getFile();
which would return NAME with EXTENSION (/filename.ext)
but How to get Filename for URLs with php ID like
http:///website.com/download.php?d=9594
I want to do this in JAVA only.
You want to look for Content-Disposition field in the header of HTTP response, e.g.
Content-Disposition: attachment; filename="fname.ext"
Since it is in the HTTP header, you will need to start downloading the message first before getting the file name. Here is an example of how you use URLConnection and how to get a header field
File file=new File("C:/work/chandan/deepak.txt");
URL url=null;
....
....
url=file.toURL(); //file:/C:/work/chandan/deepak.txt
System.out.println("The url is" + url);
Related
I'm uploading a mp4 video to AWS S3 using a pre-signed URL, the upload succeeds but when I try to download the video from S3 and play it in a media player (VLC or quickTime), it doesn't play!.
Generated pre-signed URL works fine with mp3 but the same problem as above also occurs for WAV and FLAC.
Code to generate the pre-signed url:
public String getPreSignedS3Url( final String userId, final String fileName )
{
Date expiration = new Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += urlExpiry;
expiration.setTime(expTimeMillis);
String objectKey = StringUtils.getObjectKey( userId, fileName );
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
recordingBucketName, objectKey)
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
return url.toString();
}
After I get the pre-signed URL from the method above, I make a HTTP PUT request from Postman with the multipart/form-data in the request body like this:
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F 'file=#/Users/john/Downloads/sampleDemo.mp4'
pre-signed url looks like this:
https://meeting-recording.s3.eu-west-2.amazonaws.com/331902257/sampleDemo.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20190720T125751Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3599&X-Amz-Credential=AKIAZDSMLZ3VDKNXQUXH%2F20190720%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Signature=dfb8054f0738e07e925e9880e4a8e5ebba0a1bd3c84a3ec78913239f65221992
I tried to set the content type to mp4 in the getPreSignedS3Url() method using generatePresignedUrlRequest.setContentType( "video/mp4" ); and add Content-Type : "video/mp4" in the HTTP PUT request header but it didn't work and it fails with an error Signature doesn't match.
I'm using S3 as my personal back-up hard-drive, I expect to upload video and audio files to S3 using a pre-signed URL, download them at some point in the future and be able to play them, but I'm unable to play them after I have downloaded them.
Does anyone know what could be causing this?
PUT requests to S3 don't support multipart/form-data. The request body needs to contain nothing but the binary object data. If you download your existing file from S3 and open it with a text editor, you'll find that S3 has preserved the multipart form structure inside the file, instead of interpreting it as a wrapper for the actual payload.
To add to the above answer (for future readers), I was using formData() like below to send the put request. Adding the file directly to the payload worked for me.
Don't do this:
var bodyData = new FormData();
bodyData.append('file', video);
axios.put(res?.data?.uploadURL, bodyData, {
Instead, do this:
axios.put(res?.data?.uploadURL, video, {
I am trying to download a file from a REST service using JAX-RS.
This is my code which invokes the download by sending a GET request:
private Response invokeDownload(String authToken, String url) {
// Creates the HTTP client object and makes the HTTP request to the specified URL
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url);
// Sets the header and makes a GET request
return target.request().header("X-Tableau-Auth", authToken).get();
}
However I am facing problems converting the Response into an actual File object. So what I did is the following:
public File downloadWorkbook(String authToken, String siteId, String workbookId, String savePath)
throws IOException {
String url = Operation.DOWNLOAD_WORKBOOK.getUrl(siteId, workbookId);
Response response = invokeDownload(authToken, url);
String output = response.readEntity(String.class);
String filename;
// some code to retrieve the filename from the headers
Path path = Files.write(Paths.get(savePath + "/" + filename), output.getBytes());
File file = path.toFile();
return file;
}
The file which is created is not valid, I debugged the code and noticed that output contains a String like that (much larger):
PK ͢�F���� �[ Superstore.twb�ysI�7����ߡ���d�m3��f���
Looks like binary. Obviously there is something wrong with the code.
How do I get the HTTP response body as a string from the Response object?
Edit:
Quote from the REST API reference about the HTTP response:
Response Body
One of the following, depending on the format of the workbook:
The workbook's content in .twb format (Content-Type: application/xml)
The workbook's content in .twbx format (Content-Type: application/octet-stream)
As you noticed yourself, you're dealing with binary data here. So you shouldn't create a String from your response. Better get the input stream and pipe it to your file.
Response response = invokeDownload(authToken, url);
InputStream in = response.readEntity(InputStream.class);
Path path = Paths.get(savePath, filename);
Files.copy(in, path);
1) I assume by this point you're clear on the difference between "binary file" and "text file". And that you can only capture the latter into a "string".
2) Sebastian gave you excellent advice for capturing a binary file (+1, Sebastian!). VERY IMPORTANT: you should always set the MIME type (Content-Type: xxx/yyy)in cases like this. Here is another link that might be useful.
3) Finally, there are cases where you might WANT to treat "binary" data as text. This is how e-mail attachments work with SMTP (a text protocol). In these cases, you want to use Base64 Encoding. For example: JAX-RS | Download PDF from Base64 encoded data
I am trying to download a PDF file from a response of Java REST call after custom authentication check.
I can see downloaded file but it is empty file.
Below is my code snippet.
//Custom HTTPClient
HTTPAuthClient client = new HTTPAuthClient(url,username,password)
Request request = new Request(downloadURL); //I'm downloading file content of an URL.
Response response = client.executeGet(request);
String response1 = response.getResponseBody();
InputStream is = new ByteArrayInputStream(response.getBytes());
response.setContentType("Content-type",application/pdf); //here response is //javax.servlet.HttpServletResponse
response.setHeader("Content-Disposition","attachment;filename="myfile.pdf");
IOUtils.copy(is,response.getOutPutStream());
response.flushBuffer();
With this code I could download the file but when I open the file and verified there is no data.
As part of response body also I can see some data.
Could you please help me out where I'm doing mistake I tried many options but did not find solution.
How can you use setContentType like this
response.setContentType("Content-type",application/pdf);
If only one avalible param in this method is String void setContentType(String type) so your method should be:
response.setContentType("application/pdf");
Java Doc to be sure.
I have the file location stored in the database , my file exist on that location , now I want to get that file and return it to the user. My file is not a jpg , nor pdf consider the extension as .abc.
How to return this file to the user so that user can download it , by firing the web service.
#Produces("*/*")
yourmethod(){}
Or return a javax.ws.rs.core.Response which you can set the Content-Type header programmatically
You can use the Location HTTP header for this. You can set the actual path as the location header and give back the response. It is then the responsibility of the client to redirect to that URL and download.
If you want to return the contents yourself, set Content-Type as application/octet-stream and return the file contents. I assume your rest service URL would be something like http://abc/yourapp/files/<idOfYourFile>
I am attempting to send a response redirect at the end of a Java servlet post request:
session.setAttribute("token", token);
String redirectUrl = response.encodeRedirectURL(MYSITE_URL + "extras.html");
response.sendRedirect(redirectUrl)
Stepping through the code redirectUrl equates to "http://localhost:8080/mysite/extras.html". The browswer however is attempting to request the following url, which to the observant is acutally the html of the document I'm requesting.
http://localhost:8080/mysite/%3C!DOCTYPE%20html%3E%20%3Chtml%3E%20%20%20%20%20%3Chead%3E%20%20%20%20%20%20%20%20%20%3Ctitle%3EBet%20Ya%20Friends%3C/title%3E%20%20%20%20%20%20%20%20%20%3Cmeta%20name=%22viewport%22%20content=%22width=device-width,%20initial-scale=1%22%3E%20%20%20%20%20%20%20%20%20%3Clink%20rel=%22stylesheet%22%20href=%22http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css%22%20/%3E%20%20%20%20%20%20%20%20%3Cscript%20src=%22http://code.jquery.com/jquery-1.8.2.min.js%22%3E%3C/script%3E%20%20%20%20%20%20%20%20%3Cscript%20src=%22http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js%22%3E%3C/script%3E%20%20%20%20%3C/head%3E%20%20%20%20%20%3Cbody%3E%20%20%20%20%20%20%20%20%20%3Cdiv%20data-role=%22page%22%3E%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20data-role=%22header%22%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ch1%3EBet%20Ya%20Friends%3C/h1%3E%20%20%20%20%20%20%20%20%20%20%20%20%3C/div%3E%3C!--%20/header%20--%3E%20%20%20%20%20%20%20%20%20%20%20%20%3Cul%20data-role=%22listview%22%20data-inset=%22true%22%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Cdiv%3EView%20Friends%3C/div%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%20class=%22ui-li-count%22%3E6%3C/span%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ECanary%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ECat%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EDog%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EGerbil%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EIguana%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EMouse%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/ul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Cdiv%3EMake%20A%20Bet%3C/div%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cp%20class=%22ui-li-count%22%3E6%3C/p%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EChicken%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ECow%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EDuck%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EHorse%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EPig%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ESheep%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/ul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Cdiv%3EBet%20History%3C/div%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cp%20class=%22ui-li-count%22%3E18%3C/p%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EAardvark%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EAlligator%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EAnt%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EBear%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EBeaver%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ECougar%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EDingo%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EEagle%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EElephant%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EFerret%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EFrog%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EGiraffe%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ELion%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EMonkey%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EPanda%20bear%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EPolar%20bear%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3ETiger%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cli%3E%3Ca%20href=%22index.html%22%3EZebra%3C/a%3E%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/ul%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/li%3E%20%20%20%20%20%20%20%20%20%20%20%20%3C/ul%3E%20%20%20%20%20%20%20%20%3C/div%3E%3C!--%20/page%20--%3E%3C!--%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ca%20href=%22#%22%20onclick=%22getUserFriends%28%29;%22%3EGet%20friends%3C/a%3E%3Cbr%3E%20%20%20%20%20%20%20%20%20%3Cdiv%20id=%22user-friends%22%3E%3C/div%3E%20%20%20%20%20%20%20%20%20%3Cscript%3E%20%20%20%20%20%20%20%20%20function%20getUserFriends%28%29%20{%20%20%20%20%20%20%20%20%20%20%20FB.api%28%27/me/friends&fields=name,picture%27,%20function%28response%29%20{%20%20%20%20%20%20%20%20%20%20%20%20%20console.log%28%27Got%20friends:%20%27,%20response%29;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28!response.error%29%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20markup%20=%20%27%27;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20friends%20=%20response.data;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28var%20i=0;%20i%20%3C%20friends.length%20&&%20i%20%3C%2025;%20i++%29%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20friend%20=%20friends[i];%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20+=%20%27%3Cimg%20src=%22%27%20+%20friend.picture%20+%20%27%22%3E%20%27%20+%20friend.name%20+%20%27%3Cbr%3E%27;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%27user-friends%27%29.innerHTML%20=%20markup;%20%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20}%29;%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%3C/script%3E--%3E%20%20%20%20%3C/body%3E%3C/html%3E
My question is, why? Why is the actual html document being requested rather than the url? And why is encodeURL not encoding the session in the URL?
You mentioned that MYSITE_URL is
"localhost:8080/mysite/"
. That could be the problem. Its missing http in the beginning. Can you modify MYSITE_URL to
"http://localhost:8080/mysite/"
and then try ?