Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java : How to accommodate special characters in the filename while uploading and downloading the file?

Background:

I have a file which I upload, during this process the link of the file is stored in the database and not the actual file, acutal file is stored in the File System, currently am storing it in my local machine.

Goal:

My goal is to upload a file and download a file properly which has special characters in it - #,$,%,@ etc.

Issue:

I am able to upload the file with special character but am not able to download file with special characters. Also I cannot do any changes in the Download Servlet as it is part of the Framework, so all I can work with is the Upload Servlet, so my focus is to upload file with special characters in such a way so that I can download them.

I have tried creating an alias for the filename where in am replacing the special characters with '_' symbol, this approach works fine and am able to download the file but actual name of file is not maintained in here, all special characters in the filename are replaced by '_' symbol and this is not acceptable as user should actual name of the file.

Any suggestions or approach:

Code:

public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command, 
                        ModelAndView modelView, BindException errors) throws Exception {

String newFileName = checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename());
System.out.println("alias filename="+ newFileName);
String    url = "f" + (String.valueOf(System.currentTimeMillis())) + "_" + newFileName;
String    fileName = file.getOriginalFilename(); 
System.out.println("FileName "+ fileName);
}

//Code to replace all special characters in the incoming file with '_' symbol. 
private String checkForSpecialCharsAndGetNewFileName (String originalFileName) {
  final String[] splChars = {"#", "+", "$"};
  String newString = originalFileName;
  for (int i=0; i<splChars.length; i++)
    newString = StringUtils.replace(newString, splChars[i], "_");
  return newString;
}

Hope am making some sense here.

Thanks.

like image 442
Rachel Avatar asked Jul 19 '10 18:07

Rachel


People also ask

How do I get special characters in a filename?

Type filename:*& to Explorer search field, this finds all files where the & character appears in the filename or file extension.

Which special character should be avoided during filename creation?

Illegal Filename Characters Don't start or end your filename with a space, period, hyphen, or underline. Keep your filenames to a reasonable length and be sure they are under 31 characters. Most operating systems are case sensitive; always use lowercase. Avoid using spaces and underscores; use a hyphen instead.

Can file names contain special characters?

There is no requirement to delimit the filename in any way (e.g. surround it with quotes or spaces), so encountering such a special char would cause incorrect parsing (i.e is the special char part of the filename or an operator?). <>" are reserved wildcard characters.


1 Answers

If I am understanding you correctly, you want to encode the filename such that when you upload it, and later download it, you want to be able to find the same file from the file name.

To do this, you can use URLEncoder and URLDecoder classes.

You can do this doing something like the following:

String fileName;
fileName = URLEncoder.encode("My ! String #", "UTF-8");

That will encode it. To get the original file name:

String originalFileName = URLDecoder.decode(fileName, "UTF-8");

You can use the encoded file name to download the file from the service. You can then decode the file name to store it appropriately.

Hope that helps.

like image 75
aperkins Avatar answered Oct 12 '22 00:10

aperkins