微软云+Servlet实现图片上传接口

这篇博客介绍了如何结合微软云和Servlet实现图片上传功能。通过微软Azure Storage Library for Java进行云存储接口连接,利用ServletFileUpload处理上传的图片,并借助fileupload插件解析multipart/form-data数据,实现了在保证安全性的同时将图片上传到微软云。
摘要由CSDN通过智能技术生成

业务需求是这样的:微软云+servlet开发一个图片上传的功能,要求输入一个订单号,并上传对应的图片,后台接收图片,并调用微软云接口,将图片传到微软云存储上。

开发过程中间遇到一些小问题,记录并展示出来,提供给相似的业务作参考。

1.连接微软云的图片接口
https://www.azure.cn/documentation/articles/storage-java-how-to-use-blob-storage
需要使用Microsoft Azure Storage Library for Java,如果是maven项目,可以直接使用github上的maven依赖,配置即可。由于我直接基于Servlet开发,所以我直接把maven对应的jar包下载到了本地,maven仓库链接:azure-storage-4.0.0.jar
之后按照文档去开发就可以了,因为我的业务只涉及到了上传,因此项目中只有上传的业务和一个用于查看的检索代码。

微软云部分代码如下:
设置微软云参数:

public class SaveImage extends HttpServlet {
    public static final String storageConnectionString = "DefaultEndpointsProtocol=http;" + "AccountName=微软云账户名;"+ "AccountKey=分配的Key;"+"EndpointSuffix=core.chinacloudapi.cn";  
    private CloudStorageAccount storageAccount;
    private CloudBlobClient blobClient;
    private CloudBlobContainer container;
    private BlobContainerPermissions containerPermissions;
    ...
}

在Servlet的init方法中初始化云连接

public void init() {
        System.out.println("init azureCloud");
        try {
            // 获得微软云连接
            storageAccount = CloudStorageAccount.parse(storageConnectionString);
            // 获得Blob客户端
            blobClient = storageAccount.createCloudBlobClient();
            // 定义container
            container = blobClient.getContainerReference("zzqcontainer");
            // 配置访问权限为公开只读
            containerPermissions= new BlobContainerPermissions();
            containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
            container.uploadPermissions(containerPermissions);
            // 创建container
            container.createIfNotExists();
        } catch (Exception e) {
            Data.writeLog(Global.ErrPath, "微软云启动失败" + e.getMessage());
        }
    }

上传图片到微软云:

String filePath = "D:\\feng\\perl-work\\zzq\\transInfo\\imageUpload\\"+orderid+"\\"+filename+"";
CloudBlockBlob blob = container.getBlockBlobReference(""+orderid+"/"+filename+"");
File source = new File(filePath);
blob.upload(new FileInputStream(source), source.length());

2.基于Servlet开发图片上传接口。使用的是fileupload插件,这里涉及到了两个jar包:
commons-fileupload-1.3.1.jar
commons-io-2.4.jar

fileupload可以直接把multipart/form-data形式的form解析出来,这样做的优势是可以在一个form里同时传订单号和图片内容。而不必将图片和文字做异步处理。

前端页面image.html

<form action="http://localhost:8080/transInfo/SaveImage" method="post" enctype="multipart/form-data">
<table>
<tr><td>订单号</td><td><input type="text" name="orderid"></td></tr>
<tr><td>图片1</td><td><input type="file" name="image1"></td></tr>
<tr><td>图片2</td><td><input type="file" name="image2"></td></tr>
<tr><td>图片3</td><td><input type="file" name="image3"></td></tr>
<tr><td><input type="submit" value="OK"></td></tr>
</table>
</form>

对应的Servlet代码:

ServletFileUpload:负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。
在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小,那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。等文件数据都接收完毕后,ServletUpload再从文件中将数据写入到上传文件目录下的文件中

        private File uploadPath;
        private File tempPath;
        //这两个变量需要设置在class内
        tempPath = new File("D:\\feng\\perl-work\\zzq\\transInfo\\imageUploadtest\\");
        if (!tempPath.exists()) {
            tempPath.mkdir();
        }
         /*DiskFileItemFactory:创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。  */
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(8192);
        factory.setRepository(tempPath);

        ServletFileUpload upload = new ServletFileUpload(factory);
        /* 设置上传文件大小 */
        upload.setSizeMax(1000000 * 20);
        try {
            /* 解析request成一个list */
            List<FileItem> fileItems = upload.parseRequest(request);
            String orderid = "";
            /* 遍历list */
            for (Iterator<FileItem> iter = fileItems.iterator(); iter.hasNext();) {
                FileItem item = (FileItem) iter.next();

                /* 解析文本域 */
                if (item.isFormField()) {
                    if ("orderid".equals(item.getFieldName())) {
                        orderid = item.getString();
                        /* 根据文本域定义上传路径 */
                        uploadPath = new File("D:\\\\imageUpload\\" + orderid + "\\");
                        if (!uploadPath.exists()) {
                            uploadPath.mkdir();
                        }
                    }
                }

                /* 解析非文本域 */
                if (!item.isFormField()) {
                    String fileName = item.getName();
                    long size = item.getSize();
                    if ((fileName == null || fileName.equals("")) && size == 0) {
                        continue;
                    }
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
                    fileNameList.add(fileName);
                    item.write(new File(uploadPath, fileName));
                }

            }
            System.out.println(orderid + "上传完成");

这样就相当于使用自己的服务器做中转,将页面传入的文件传输到了微软云上,避免了直接将微软云的账号密码暴露给第三方的风险。

### 回答1: 好的,我可以回答您的问题。 JSP和ServletJava Web开发中的两个重要组成部分。JSP(Java Server Pages)是一种在服务器端生成动态Web页面的技术,而Servlet是一种运行在服务器端的Java程序,用于处理HTTP请求和响应。 要实现图像上传和显示,您可以按照以下步骤操作: 1. 在JSP页面中,创建一个HTML表单,使用户可以选择要上传的图像文件。在表单中,您可以使用<input type="file">元素来让用户选择文件。 2. 在表单中,添加一个提交按钮,将表单数据发送到服务器。 3. 创建一个Servlet,用于处理表单数据。在Servlet中,您可以使用Apache Commons FileUpload库来处理文件上传。 4. 在Servlet中,将上传的图像文件保存到服务器上的某个位置,例如Web应用程序的根目录下的“images”文件夹中。 5. 将上传的图像文件的路径存储在一个Java对象中,并将该对象作为请求属性传递回JSP页面。 6. 在JSP页面中,使用<img>元素显示上传的图像。您可以使用<img>元素的src属性指定图像文件的路径,该路径应该是从Web应用程序的根目录开始的相对路径。 下面是一个简单的示例,演示如何在JSP页面中实现图像上传和显示: 在JSP页面中: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图像上传和显示</title> </head> <body> <h1>图像上传和显示</h1> <form action="uploadServlet" method="post" enctype="multipart/form-data"> <label for="file">选择一个图像文件:</label> <input type="file" name="file" id="file"> <br> <input type="submit" value="上传"> </form> <% String imagePath = (String) request.getAttribute("imagePath"); %> <% if (imagePath != null) { %> <h2>上传的图像:</h2> <img src="<%= request.getContextPath() %>/<%= imagePath %>"> <% } %> </body> </html> ``` 在Servlet中: ``` import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import java.io.File; import java.io.IOException; import java.util.List; @WebServlet(name = "UploadServlet", urlPatterns = {"/uploadServlet"}) @MultipartConfig public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { if (!item.isFormField()) { String ### 回答2: 采用jsp servlet实现图片上传和展示可以通过以下步骤实现: 1. 在jsp页面中创建一个表单,包含一个文件选择框和一个提交按钮。用户可以通过文件选择框选择需要上传的图片。 2. 在servlet中处理上传的图片。首先,通过HttpServletRequest对象获取上传的文件。然后,可以通过文件的输入流将其保存在服务器的指定位置。可以使用FileOutputStream类创建一个输出流,再使用InputStream类的getInputStream()方法获取输入流,并将其写入输出流中保存。 3. 在servlet中处理上传成功后的图片展示。可以通过设置返回的响应头为图片的MIME类型,将图片的二进制数据读取并写入响应的输出流中,然后将其返回给浏览器以展示图片。 4. 在jsp页面中,可以使用img标签的src属性将servlet返回的图片url设置为要展示的图片路径,并在页面中展示图片。 需要注意的是,为了防止恶意上传和安全问题,可以进行文件类型的验证,只允许上传图片类型的文件。还可以给上传的文件进行重命名,以避免重复文件名的问题。同时,需要在服务器中配置合适的路径,用于保存上传的图片文件。 以上是基本的实现步骤,具体细节可以根据实际需求进行扩展和优化。 ### 回答3: 使用JSP和Servlet实现图片上传和展示的步骤如下: 1. 首先,创建一个包含上传表单的JSP页面。该页面应该包含一个文件输入框和一个提交按钮。用户可以选择要上传的图片文件,并点击提交按钮将其发送到服务器。 2. 创建一个Servlet来处理文件上传请求。在该Servlet中,我们可以使用Apache Commons FileUpload库来解析上传的文件,并将其保存到服务器上的指定位置。首先,我们需要检查请求中是否包含文件上传数据,然后通过FileUpload解析这些数据。最后,使用IO流将上传的文件保存到服务器上的指定位置。 3. 接下来,我们可以创建一个显示图片的JSP页面。该页面应该包含一个用于展示图片的img标签和一个用于选择要展示的图片的下拉框。我们可以使用Java代码读取服务器上的图片文件,并将其作为img标签的src属性值。 4. 再次创建一个Servlet来处理显示图片请求。在该Servlet中,我们需要读取请求参数中选择的图片文件的名称,并将其转化为服务器上的文件路径。然后,我们可以使用IO流将该图片文件的内容写入到响应中,以便将其显示在浏览器中。 5. 最后,我们需要配置web.xml文件来映射Servlet和JSP页面的URL。确保我们可以通过访问相应的URL来上传和展示图片。 通过以上步骤,我们可以使用JSP和Servlet实现图片上传和展示的功能。用户可以通过上传表单选择并上传图片文件,然后可以在展示页面中查看已上传的图片
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值