我正在尝试创建一个上传图像按钮,然后在不同的 jsp 页面上显示该图像。
我想通过上传到 app-root/data/images
文件夹来做到这一点。这适用于以下文件路径:filePath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
但是我怎样才能在我的 jsp 上显示这个图像呢?我尝试使用:
<BODY>
<h1>SNOOP PAGE</h1>
<a href="profielMijnBedrijf.jsp">Ga weer terug</a>
<% String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/";
out.println("<img src='"+filepath+"logo21.jpg'/>");
%>
<img src="app-root/data/images/logo21.jpg"/>
</BODY>
这两个选项都不起作用。我还读到我需要创建一个符号链接(symbolic link)。但是,当我在我的 app-root/data
或 app-root/data/images
或 app-root
中时,命令 ln -s
返回丢失的文件操作数
logo21.jpg 确实出现在我的 Git bash 中
最佳答案
@developercorey 是对的(给你 +1 👍),我只是觉得有必要解释一下原因:
- 您上传的图片最终保存在您的服务器
上的一个文件夹中 (String filepath = System.getenv("OPENSHIFT_DATA_DIR") + "images/"
是服务器中的文件夹路径)。 - 您呈现的 HTML
"<img src='"+filepath+"logo21.jpg'/>
使用服务器的filepath
发送到客户端(用户的浏览器)网址。 - 显然,当用户的浏览器尝试使用本地计算机上不存在的服务器路径定位图像时,它不会起作用。
正如@developercorey 所建议的那样,最好的解决方案是添加一个新的 servlet 或过滤器来提供来自 OPENSHIFT_DATA_DIR
的照片。文件夹:
- 您将有一个新的 url 映射到为您的照片提供服务的 servlet,类似于
http://your-server/uploaded/
- 你可以使用
<img src="http://your-server/uploaded/logo21.jpg" />
在你的 jsp 中。
这是来自 How-To: Upload and Serve files using Java Servlets on OpenShift 的片段
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet(name = "uploads",urlPatterns = {"/uploads/*"})
@MultipartConfig
public class Uploads extends HttpServlet {
private static final long serialVersionUID = 2857847752169838915L;
int BUFFER_LENGTH = 4096;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
for (Part part : request.getParts()) {
InputStream is = request.getPart(part.getName()).getInputStream();
String fileName = getFileName(part);
FileOutputStream os = new FileOutputStream(System.getenv("OPENSHIFT_DATA_DIR") + fileName);
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = is.read(bytes, 0, BUFFER_LENGTH)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
is.close();
os.close();
out.println(fileName + " was uploaded to " + System.getenv("OPENSHIFT_DATA_DIR"));
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = request.getRequestURI();
File file = new File(System.getenv("OPENSHIFT_DATA_DIR") + filePath.replace("/uploads/",""));
InputStream input = new FileInputStream(file);
response.setContentLength((int) file.length());
response.setContentType(new MimetypesFileTypeMap().getContentType(file));
OutputStream output = response.getOutputStream();
byte[] bytes = new byte[BUFFER_LENGTH];
int read = 0;
while ((read = input.read(bytes, 0, BUFFER_LENGTH)) != -1) {
output.write(bytes, 0, read);
output.flush();
}
input.close();
output.close();
}
private String getFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
return cd.substring(cd.indexOf('=') + 1).trim()
.replace("\"", "");
}
}
return null;
}
}
关于java - OpenShift Java - 使用数据目录中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247111/